1.BST中的最低公共祖先
在BST中的特殊形式使得假如出现了一个数比其中一个小,比另一个大就是复合题意了。不可能出现还有另外的情况。
public TreeNode lowestCommonAncestor(TreeNode node, TreeNode p, TreeNode q) {
TreeNode root=node;
if(root.val>=p.val&&root.val<=q.val){
return root;
}else if(root.val>p.val&&root.val>q.val){
return lowestCommonAncestor(root.left,p,q);
}else if(root.val<p.val&&root.val<q.val){
return lowestCommonAncestor(root.right,p,q);
}
return node;
}
这里还要考虑的应该是给的两个节点的相对大小,我认为为了健壮性应该要自己先比较一下确认大小
2.一般二叉树的最低公共祖先
假如当前的节点为正常节点,我的左子树找到了一个结果,事实上这个结果只能是p,q之一。倘若此时右子树什么都没有找到的话就是左子树的结果作为结果了。假如右子树也找到了一个结果,同样只能是p,q之一,那么 此时的当前节点就是我们寻找的最低公共祖先。
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root == null) {
return null;
}
if (root == p || root == q) {
return root;
}
TreeNode left = lowestCommonAncestor(root.left, p, q);
TreeNode right = lowestCommonAncestor(root.right, p, q);
if (left != null && right != null) {
return root;
} else {
return (left != null) ? left : right;
}
}