【问题标题】:How to find the height of a binary tree without using recursion and level order traversal?如何在不使用递归和级别顺序遍历的情况下找到二叉树的高度?
【发布时间】:2014-06-05 18:31:25
【问题描述】:

我想出了一个前序遍历来找到一棵树的高度。

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

【问题讨论】:

  • while(n->child) { depth++; n = n->child },基本上,如果你假设树是平衡的。
  • 为什么不想递归?

标签: c tree tree-traversal preorder


【解决方案1】:

考虑以下树 -

    o
   / \
  o   o
 /     \
o       o 

您将使用 c==2 到达最左侧分支的末尾,然后在向上的过程中弹出节点,但仅对具有右子节点的节点递减 c,而实际上您应该在每次弹出时递减它,因为这意味着你升级了,不管其他孩子。在这种情况下,您将到达顶部节点,递减一次,然后以 c==1 从根开始递减,最终达到 3。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    相关资源
    最近更新 更多