【235. 二叉搜索树的最近公共祖先】中等题
题目描述
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]
解法
我们需要注意这棵树是二叉搜索树,充分利用二叉搜索树的特征。
显然是采用遍历的方法找到所求的最近公共祖先。但是此题遍历选择左右子树的条件稍微一点点难想。
具体思路在代码注释中,代码如下:
/**
* 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) {
TreeNode curr = root;
while(curr != null) {
if(curr.val > p.val && curr.val > q.val) {
// 当前节点值大于 p 和 q 的值,说明 p 和 q 应该在当前节点的左子树
// 将当前节点移动到它的左子节点
curr = curr.left;
}else if(curr.val < p.val && curr.val < q.val) {
// 当前节点值小于 p 和 q 的值,说明 p 和 q 应该在当前节点的左子树
// 将当前节点移动到它的右子节点
curr = curr.right;
}else {
// 当前节点是「分岔点」
// p 和 q 要么在当前节点的不同的子树中,要么其中一个就是当前节点,当前节点即为所求
break;
}
}
return curr;
}
}