查找二叉树某两个节点最近的共同祖先及改进方法

本文介绍了如何在二叉树中寻找两个指定节点的最近共同祖先。传统方法是通过两次先序遍历创建两个栈,然后比较栈中的元素找到最近公共祖先。改进方法包括使用一次遍历记录两个栈,并在找到节点后调整栈的状态,以及通过计算栈中元素数量的差值来避免栈的反转,从而降低时间和空间复杂度。
摘要由CSDN通过智能技术生成

这个题目偶尔看到网上有个解法是这样的,如下面一个普通二叉树


我们要求结点3和结点12的最近共同祖先(指针类同,改变栈的存储类型即可)。

对树进行先序遍历,我们先求从根结点到3得一条路径,放入栈中,为14-8-5-3;再求得跟结点到12得一条路径,为14-8-12,也放入栈中。

stack<int> getStack(Tree * T, int data);

stack<int> A = getStack(T, 3);

stack<int> B = getStack(T, 12);

如下图所示


我们需要从栈底遍历,找到最后一个相同的元素即为要求的祖先。但是栈只能从栈顶操作,所以我们需要将两个栈反转,如下图


我们将14出栈,8出栈,然后下一个元素不相同,则8既是我们所求。


改进:

上面的方法有些繁琐,下面具体说下改进的方法。

1、上述方法求栈用了两个遍历,可否用一次遍历呢?当然可以,可以设置两个全局变量,如栈A、B,当找到第一个结点(假设是3)之后A不在变化,将A赋给B,当找到第二个结点(假设是12)之后B不再变化,当两者都找到后,退出函数。

2、紧接着我们看到栈还需要反转一下,这势必会增加时间和空间复杂度。我们观察两个栈的特点,我们发现从栈底开始都是两个结点的相同祖先,那么我们如果先把左边的3出栈,此时两个栈中得元素个数便相同了,此时两个栈一次一个出栈,直到有相同的元素出栈,便得所求。

所以我们只需找出两个栈的元素个数差d,然后将元素个数多的栈先出栈d个元素。


左边栈中有4个元素,右边有3个元素,d=4-3=1,左边要先出栈一个元素,先出栈元素 3。此时两个栈元素个数相同,然后同时出栈,5、12不同,出栈继续,8相同,结束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值