题源:王道p139
\qquad
在二叉树中有两个结点m和n,若m是n的祖先,则使用后序遍历可以找到从m到n的路径。
\qquad
此处找到从m到n的路径,意思是此时栈中可以找到m到n的路径,即栈存储的都是n的祖先
(默认为非递归,递归的话一股脑全输出了没法操作)
👉非递归遍历中栈的知识详解
\qquad
因为先序、中序都会在根及左子全部压入后,弹出,所有处在根左子树上的某个右子结点,就会先弹出他的左兄弟,父结点,然后将其压栈。
因此,双亲出栈后才会压入右节点,故不可能找到右节点到根的路径。
\qquad
后序总是在根取出之前,GetTop(S),然后压入右节点,所有后序的栈中存在一条根到栈顶的路径。
\qquad
由此,我们可以求树的高度,因为总会在某个时候,最长路径在栈中,我们只需要将栈最长时的长度记录,即是树的高度。
后序求树高
求树长详解🉑
后序是从上向下全部压栈,从叶子开始出栈。
对于前序,先输出并压入左子树,pop根的所有左子树,然后pop根,然后push根所有右子树。
只需在原代码的基础上,增加一个depth变量,每次push的时候记录栈长即可。
int Q5(BiTree T) {
SqStack S;
S.top = -1;
BiNode* p = T, * r = NULL;
int depth = 0; //记录栈长
while (p || !isEmpty(S)) {
if (p) {
push(S, p);
p = p->lchild;
depth = depth > S.top+1 ? depth : S.top+1; //取大的
}
else {
p = GetTop(S);
if (p->rchild && p->rchild != r)
p = p->rchild;
else {
pop(S, p);
r = p;
p = NULL;
}
}
}
return depth;
}