问题: 给定两个节点,求它们在一棵二叉树中的最小公共祖先。每个节点除了有左右子树外,还有一个指向其父节点的指针。
思路: 由于有指向父节点的指针,两个节点沿着父指针到达根节点形成两根链表,问题转化为求两链表交点。先分别求链表长度,再将两链表放在同一起点,同时前进直到相遇。
java代码:
TreeNode LCA2(TreeNode root,TreeNode p,TreeNode q){
if(root==null||p==null||q==null)
return null;
TreeNode pq=new TreeNode(0);
//找出p,q在二叉树中对应的节点
help(root,p,q,pq);
TreeNode pp=pq.left,qq=pq.right;
if(pp==null||qq==null)
return null;
int lenp=0,lenq=0;
TreeNode up1=pp,up2=qq;
while(up1!=root){
up1=up1.parent;
lenp++;
}
while(up2!=root){
up2=up2.parent;
lenq++;
}
up1=pp;
up2=qq;
while(lenp>lenq){
up1=up1.parent;
lenp--;
}
while(lenq>lenp){
up2=up2.parent;
lenq--;
}
while(up1!=up2){
up1=up1.parent;
up2=up2.parent;
}
return up1;
}
void help(TreeNode root,TreeNode p,TreeNode q,TreeNode pq){
if(root==null)
return;
if(root==p)
pq.left=p;
if(root==q)
pq.right=q;
if(pq.left==null||pq.right==null){
help(root.left,p,q,pq);
help(root.right,p,q,pq);
}
}