235.二叉搜索树的最近公共祖先
思路1:
- 如果 (root.val - p.val) * (root.val - q.val) > 0 ,则代表p,q在同一个子树上,此时根据 (root.val - p.val) 的大小判断同在左子树还是右子树,然后继续到子树中寻找
- 如果 (root.val - p.val) * (root.val - q.val) <= 0,则代表 p,q在根节点两边,即此时根节点就是最近公共祖先
- 可以代码整合简化成如下:
代码实现
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
while ((root.val - p.val) * (root.val - q.val) > 0) {
root = root.val < p.val ? root.right : root.left;
}
return root;
}
}
思路2(递归):
- 如果 (root.val - p.val) * (root.val - q.val) > 0 ,则代表p,q在同一个子树上,此时根据 (root.val - p.val) 的大小判断同在左子树还是右子树,然后继续到子树中寻找。此处到子树中寻找用递归法
- 递归终止条件:(root.val - p.val) * (root.val - q.val) <= 0,说明在root两侧 或者 p或者q此时就是root,直接返回root即可
代码实现
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if ((root.val - p.val) * (root.val - q.val) <= 0) return root;
return lowestCommonAncestor(root.val > p.val ? root.left : root.right, p, q);
}
}