利用前后序遍历求解树中两个节点的最低公共节点

问题:
     求树种任意两个节点的最低公共节点
 

常见的解法是求解节点到根的路径,对路径做比对。参见: http://gaotong1991.iteye.com/blog/2042770

下面来介绍另外一种方法求解。
准备:
1、什么是最低公共节点?
 
2、最低公共节点有哪些方面需要注意?
答:按照两个节点是否存在一个节点(设为A)是以另外一个节点(设为B)为根的子树中,分为两种情况:
    意味着A和B在B的一个分支下,返回B即可。
    意味着A和B肯定在公共节点的不同分支下,可以按下文的2、3、4步骤处理。
3、如何判断两个节点是否存在一个节点(设为A)是另外一个节点(设为B)的(直接或间接)孩子?
答:如果两个节点在树的前序和后续遍历中出现的顺序相反,则说明存在;反之,不存在。
 
示例数据:


 
测试用例:
     F/H-->B;B/F-->B
步骤:
1、分别输出树的前序(ABDFGEHIJC)和后续遍历结果(FGDHIJEBCA);
2、如果F、H在前序和后续中的出现顺序相反,则说明F、H存在一个节点在另外一个节点的子树中的情况(例如选择的节点是B和F,F位于以B为根子树中),直接返回前序遍历中较早出现的一个节点, 程序退出
3、对前序遍历结果求出两个节点(F,H)前面的公共节点数组(按正序排列),记为 M(ABD)
4、对后续遍历结果求出两个节点(F,H)后面的公共节点(按逆序排列),记为 N(ACBEJI)
5、求 MN的最大公共子序列 K(AB), K的最后一个元素B就是最低公共祖先, 程序退出
特点:
1、前序遍历和后续遍历的结果对于任何两个节点而言都是可用的,意味着不管是对哪两个节点来说,都可以使用遍历的结果;
2、将非线性问题转换为线性问题——最大公共子序列。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值