我想出了一个寻找树高的前序遍历。
void preHeight(node * n)
{
int max = 0,c = 0;
while(1)
{
while(n)
{
push(n);
c++;
if(c>max)
max = c;
n= n->left;
}
if (isStackEmpty())
return max;
n = pop();
if(n->right) //Problem point
c--;
n=n->right;
}
}
我的身高正确,但我不确定我的方法是否正确。我所做的是将计数器c
递增到最左边的节点然后,如果我向上移动我会减少它以防我需要向右移动,然后重复整个练习。这是对的吗?
答案 0 :(得分:0)
考虑以下树 -
o
/ \
o o
/ \
o o
你将以c == 2到达最左边的分支的末尾,然后在上升的过程中弹出节点,但是对于有正确子节点的节点只减少c
,实际上你应该减少每个节点流行,因为它意味着你升级,不管其他孩子。在这种情况下,您将到达顶部节点,减少一次,然后从c == 1开始从根下降,最终达到3。
如果删除条件,它应该有效。或者,您可以保持每个级别c
的值,而不是使用减量来恢复它 - 您可以将它与节点指针一起推送到单独的堆栈中,或者您可以将代码转换为递归的,使用{ {1}}(和当前节点)作为局部变量(基本上这是相同的,除了编译器为你维护堆栈)。