LC235 二叉搜索树的公共祖先
BST特性,左<根<右
思路:
如果 p<root<q 或者 q<root<p, 则公共祖先为root
如果 p<q<root 或者 q<p<root, 则递归为f(root.left,p,q)
同理,递归为f(root.right,p,q)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if((root.val >= p.val && root.val <= q.val)||(root.val >= q.val && root.val <= p.val)){
return root;
}
if(root.val > p.val && root.val > q.val){
TreeNode leftRes = lowestCommonAncestor(root.left, p, q);
return leftRes;
}
else{
TreeNode rightRes = lowestCommonAncestor(root.right, p, q);
return rightRes;
}
}
}
LC235 普通二叉树的公共祖先
思路:
如果q p任意一个为root,则直接返回root;
递归 left = f(root.left,p,q)
递归 right = f(root.right,p,q)
如果left为空,则说明p q都在右子树上,继续递归
如果right为空,则说明p q都在左子树上,继续递归
如果left,right都不为空,则p q分别分布在左右两子树,则返回root
(有一点不理解,为什么pq分布在哪边子树上,哪边函数值就不为空呢??)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
//递归
if(root == null)
return null;
if(p == root || q == root)
return root;
TreeNode left = lowestCommonAncestor(root.left, p, q);
TreeNode right = lowestCommonAncestor(root.right, p, q);
if(left != null && right != null) return root;
if(left == null) return right;
if(right == null) return left;
return null;
}
}