LCA of two nodes in tree

这道题目有几个版本,不同版本解法不一,还记得徐师兄好像当年QQ还是百度笔试有这道题目,不大确定,这也是剑指Offer最后一题 (LCA= lowest common ancestor)
Node FindLCA(Node root, Node p1, Node p2)

  1. 二叉有序树
    利用有序的性质,如果都在当前子树左边,往左边找,若都在右边,往右边找,若一左一右,返回,非常简明,一个while循环就出来了,
    因为每一步可以直接获得值,所以不需要递归 ,后面会遇到这种不能直接获得值得,可能就需要递归了

2.三叉链表
一般想到的都是有parent指针,这样会比较方便一点,分别从p1 p2到root,记录到两个另外的linklist,然后转化为
两个linklist第一个公共结点的位置,转化为编程之美的题目,各种方法都适用,例如先记录两个长度,然后指针对齐,在逐步后移。
从这里我联想到一个问题,因为二叉链表和单链表不一样,肯定要单独cppy到一个linklist里,但是不能只copy值。于是联想到linklist其实最本质的是结点的地址,例如编程之美那道,
是找到是否两个point值相同,而不是值,于是用存指针的数组是可以模拟两个链表相交的情况的,存值是不对的。当然解法里面用存address的linklist也是一个道理。

3.普通二叉树
1.递归算法:
感觉设计递归的时候,总是想到设计参数就比较麻烦,于是想到了一个方法,就是写成一个描述性的语句,里面包含的东西作为参数

找root 中p1 p2的LCA
if left tree 有p1 p2, right tree 无
找left tree中p1 p2的LCA
else if 左无,右有
找right tree中p1 p2的LCA
else 一有一无
return root

这样的话感觉结构很清晰,里面有两类描述语句,不知道是否可以统一成一个函数的功能。感觉好像不行,可能需要写一个判断二叉树是否有p1 p2这样一个函数。

  1. 非递归算法
    模仿三叉链表,既然没有parent,那就从root开始遍历找 到p1 p2的path,copy到linklist,然后从尾部开始找两个linklist的(FCN)first common node,但是看到的代码是从公共部分的一端开始,只要相同就覆盖,
    最后一次覆盖的也是前面开始的FCN

Posted by richard爱闹 - 7月 14 2014
如需转载,请注明: 本文来自 Richard