给一棵二叉树和二叉树中的两个节点,找到这两个节点的最近公共祖先LCA
。
两个节点的最近公共祖先,是指两个节点的所有父亲节点中(包括这两个节点),离这两个节点最近的公共的节点。
每个节点除了左右儿子指针以外,还包含一个父亲指针parent
,指向自己的父亲。
样例
对于下面的这棵二叉树
4
/ \
3 7
/ \
5 6
LCA(3, 5) = 4
LCA(5, 6) = 7
LCA(6, 7) = 7
解题思路:
由于包含指向父亲的指针,所以可以获得两节点到根节点的路径,通过从后向前比较路径来找到LCA。
eg: 3->4 5->7->4 两路径最近相同节点为4
5->7->4 6->7->4 两路径最近相同节点为7
/**
* Definition of ParentTreeNode:
*
* class ParentTreeNode {
* public ParentTreeNode parent, left, right;
* }
*/
public class Solution {
/*
* @param root: The root of the tree
* @param A: node in the tree
* @param B: node in the tree
* @return: The lowest common ancestor of A and B
*/
public ParentTreeNode lowestCommonAncestorII(ParentTreeNode root, ParentTreeNode A, ParentTreeNode B) {
// write your code here
if(root == null || root == A || root == B)
return root;
ArrayList<ParentTreeNode> listA = getPath2Root(A);
ArrayList<ParentTreeNode> listB = getPath2Root(B);
int indexA = listA.size()-1;
int indexB = listB.size()-1;
ParentTreeNode res = null;
//从尾部向前依次比较两条路径中节点是否一致,找到最近一致的节点,即为LCA
while(indexA>=0 && indexB>=0){
if(listA.get(indexA) != listB.get(indexB)){
break;
}
res = listA.get(indexA);
indexA--;
indexB--;
}
return res;
}
//获取当前节点到root节点的路径
private ArrayList<ParentTreeNode> getPath2Root(ParentTreeNode node){
ArrayList<ParentTreeNode> res = new ArrayList<>();
while(node != null){
res.add(node);
node = node.parent;
}
return res;
}
}