剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
难度:简单
题目描述
解题思路
二叉树嘛,肯定是递归,由于是二叉搜索树,所以可以很容易的判断出节点位于根节点的哪一边。分为以下几种情况:
1、其中一个节点就是根节点,那最近公共祖先就是根节点
2、一个在根节点左边,一个在根节点右边,最近公共祖先也是根节点
3、两个都在根节点左边,那以根节点的左孩子作为根节点继续递归过程
4、两个都在根节点右边,那以根节点的右孩子作为根节点继续递归过程
/*
* 剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
* 难度:简单
* 2020/8/1
*/
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root.val == p.val || root.val == q.val) { //如果其中一个是根
return root;
}
if(p.val < root.val && q.val > root.val || p.val >root.val && q.val < root.val) { //如果一个在根左边一个在根右边
return root;
}
if(p.val < root.val && q.val < root.val ) {
return lowestCommonAncestor(root.left, p, q);
}
if(p.val > root.val && q.val > root.val) {
return lowestCommonAncestor(root.right, p, q);
}
else {
return null;
}
}
上面那种写法可读性会好一点,也可以合并其中一些情况,代码会更简洁:
public TreeNode lowestCommonAncestor1(TreeNode root, TreeNode p, TreeNode q) {
if(root == null) {
return null;
}
if(p.val < root.val && q.val < root.val ) {
return lowestCommonAncestor(root.left, p, q);
}
if(p.val > root.val && q.val > root.val) {
return lowestCommonAncestor(root.right, p, q);
}
return root;
}