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

C 如何在不使用递归和水平顺序遍历的情况下找到二叉树的高度?,c,tree,tree-traversal,preorder,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; }

我提出了一种预先排序遍历方法来查找树的高度

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,而实际上,您应该在每次弹出时减小c,因为这意味着您上升了一个级别,而不考虑其他子节点。在本例中,您将到达顶部节点,递减一次,然后从根开始递减,c==1,最终达到3


如果你消除了这种情况,它应该会起作用。或者,您可以在每一级保留c的值,而不是使用减量恢复它-您可以将其推到节点指针旁边的单独堆栈中,或者您可以将代码转换为递归代码,使用c和当前节点作为局部变量基本上是一样的,除了编译器为您维护堆栈。

whilen->child{depth++;n=n->child},基本上,如果您假设树是平衡的,那么您为什么不希望递归呢?