面試題68:樹中兩個結點的最低公共祖先
一、題目描述
輸入兩個樹結點,求它們的最低公共祖先。
二、問題分析
這屬於劍指Offer面試案例中探討的一道問題。
在解答之前要先和面試官確定是否爲二叉樹,如果是,還要確定是否爲二叉搜索樹,是否有父引用,或者僅僅是普通二叉樹。
案例中確定樹爲二叉樹,不過樹可能有兩種,一種是二叉搜索樹,一種是普通樹。
二叉樹節點的定義
public class Node {
int val = 0;
Node left = null;
Node right = null;
public Node(int val) {
this.val = val;
}
}
如果樹爲二叉搜索樹時,最低公共祖先結點的大小在兩個樹結點大小的中間。
如果樹爲普通樹時,使用遍歷將子結點的信息往上傳遞。在左右子樹中進行查找是否存在兩個樹結點,如果兩個樹結點分別在左右子樹上,說明該根結點就是它們的最低公共祖先。
三、問題解答
二叉樹
// 二叉搜索樹
public Node getLowestCommonParentBST(Node root,Node node1,Node node2) {
while(true) {
if(root==null)
return null;
if(root.val<node1.val && root.val<node2.val) {
root=root.right;
} else if(root.val>node1.val && root.val>node2.val) {
root=root.right;
} else {
return root;
}
}
}
普通二叉樹
// 普通二叉樹 將下面結點的信息利用遞歸s往上傳遞
public Node getLowestCommonParent(Node root, Node node1, Node node2) {
if(root==null || root== node1 || root== node2) {
return root;
}
Node left=getLowestCommonParent(root.left, node1, node2);
Node right=getLowestCommonParent(root.right, node1, node2);
return left==null? right:(right==null? left:root);
}