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},基本上,如果您假设树是平衡的,那么您为什么不希望递归呢?