繁体   English   中英

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

[英]How to find the height of a binary tree without using recursion and level order traversal?

我想出了遍历遍历的方法来找到树的高度。

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

考虑下面的树-

    o
   / \
  o   o
 /     \
o       o 

您将以c == 2到达最左边分支的末尾,然后向上弹出节点,但对于具有右子节点的节点仅减少c ,实际上,您应该在每次弹出时都将其减少,因为这意味着您去了a升级,无论其他孩子如何。 在这种情况下,您将到达顶部节点,递减一次,然后以c == 1从根开始下降,最终达到3。

如果您删除该条件,它将正常工作。 或者,您可以保留每个级别的c值,而不用递减的方式恢复它-您可以将其压入节点指针旁边的单独堆栈中,也可以使用c (以及当前值)将代码转换为递归节点)作为局部变量(基本上是同一回事,只是编译器会为您维护堆栈)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM