题:后序遍历可以找到m到n的路径

这篇博客探讨了在非递归后序遍历二叉树时如何找到两个节点m和n之间的路径,以及如何利用这种遍历方式求解树的高度。关键在于后序遍历的特性,它能在栈中保存从根节点到当前节点的路径。通过维护一个栈的深度记录,可以在适当时刻获取到树的最大深度,从而得到树的高度。此外,还详细解释了前序遍历的过程,并提出了如何修改原代码以记录栈的最大深度。
摘要由CSDN通过智能技术生成

题源:王道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;
}
  • 12
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值