問題: 給定兩個節點,求它們在一棵二叉樹中的最小公共祖先。每個節點除了有左右子樹外,還有一個指向其父節點的指針。
思路: 由於有指向父節點的指針,兩個節點沿着父指針到達根節點形成兩根鏈表,問題轉化爲求兩鏈表交點。先分別求鏈表長度,再將兩鏈表放在同一起點,同時前進直到相遇。
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);
}
}