描述
给定一棵二叉树,找到两个节点的最近公共父节点(LCA)。
最近公共祖先是两个节点的公共的祖先节点且具有最大深度。
注意事项
假设给出的两个节点都在树中存在
样例
对于下面这棵二叉树
4
/ \
3 7
/ \
5 6
LCA(3, 5) = 4
LCA(5, 6) = 7
LCA(6, 7) = 7
代码
由题意知,如果节点A和B在同一个左子树上,则继续遍历该左子树。
如果节点A和B在同一个右子树上,则继续遍历该右子树。
如果节点A和B不在同一个子树上,则返回root。
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
public class Solution {
/*
* @param root: The root of the binary search tree.
* @param A: A TreeNode in a Binary.
* @param B: A TreeNode in a Binary.
* @return: Return the least common ancestor(LCA) of the two nodes.
*/
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode A, TreeNode B) {
// write your code here
if(root==null){
return null;
}
boolean la=order(root.left,A);
boolean lb=order(root.left,B);
boolean ra=order(root.right,A);
boolean rb=order(root.right,B);
if(la&&lb){ //a和b都在左子树上,继续找公共祖先
root=lowestCommonAncestor(root.left,A,B);
}else if(ra&&rb){ //a和b都在右子树上,继续找公共祖先
root=lowestCommonAncestor(root.right,A,B);
}
return root;
}
public boolean order(TreeNode root, TreeNode A){
if(root==null){
return false;
}
if(A==root){
return true;
}
return order(root.left,A)||order(root.right,A);
}
}