如何在不使用递归和级别顺序遍历的情况下找到二叉树的高度?

时间:2014-06-05 18:31:25

标签: c tree tree-traversal preorder

我想出了一个寻找树高的前序遍历。

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递增到最左边的节点然后,如果我向上移动我会减少它以防我需要向右移动,然后重复整个练习。这是对的吗?

1 个答案:

答案 0 :(得分:0)

考虑以下树 -

    o
   / \
  o   o
 /     \
o       o 

你将以c == 2到达最左边的分支的末尾,然后在上升的过程中弹出节点,但是对于有正确子节点的节点只减少c,实际上你应该减少每个节点流行,因为它意味着你升级,不管其他孩子。在这种情况下,您将到达顶部节点,减少一次,然后从c == 1开始从根下降,最终达到3。

如果删除条件,它应该有效。或者,您可以保持每个级别c的值,而不是使用减量来恢复它 - 您可以将它与节点指针一起推送到单独的堆栈中,或者您可以将代码转换为递归的,使用{ {1}}(和当前节点)作为局部变量(基本上这是相同的,除了编译器为你维护堆栈)。