LeetCode Lowest Common Ancestor of a Binary Tree(LCA问题)

问题:求二叉树中两个结点p,q的最近公共祖先

思路:第一种方法是二叉树的递归,当搜索是当前结点为p或者为q时,直接返回对应结点。然后再左右子树的返回情况 

1、如果左右子树非空,则当前结点就是要找的最近公共祖先

2、如果左子树返回的为空,右子树返回的不为空,则以右子树的结果返回

3、如果左子树返回的不为空,右子树返回的为空,则以左子树的结果返回。

第二种方式就是先求得p的父结点、父父结点等保存,然后在判断q的父结点、父父结点等是在在保存的结果中出现,就是该结点就是要求的结点。

第三种方式 就是使用tarjan的离线算法

第四种方法根据树的高度h将树分成 sqrt(h)段,第一段是从[0,sqrt(h)-1],第二段是[sqrt(h), 2 * sqrt(h) -1],...。使用变量p[i]来表示结点i在上一段中最后一层的祖先。结点编号从1开始,因此对于深度小于sqrt(h)的有p[i]=1,其它段的第一层结点的p[i]等于i的父结点,而非第一层的p[i]=p[parent[i]],在求u,v的最近公共祖先时,先找到u,v的所在的段

第五种方法是通过将LCA问题转为RMQ问题,通过遍历树得到欧拉序以及记录结点访问时第一次出现在欧拉序中的位置,通过u,v得到u,v首次出现在欧拉序中的位置,在这区间查找深度最小的即可

具体代码参考:

https://github.com/wuli2496/OJ/tree/master/LeetCode/Lowest%20Common%20Ancestor%20of%20a%20Binary%20Tree

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值