题目描述
LeetCode 题目链接
题解
本题属于“按图索骥”,就一个要点:
- 待查找节点 p q 在某一节点 C 的两侧,那么 C 即为 最近的公共祖先
翻译一下就是:
- 从根节点出发,找俩孙子,找到一个岔路口,左右为难时。这个岔路口就是最近公共祖先。
/**
* 公共祖先的定义为:“对于有根树 T 的两个结点 p、q,
* 最近公共祖先表示为一个结点 x,
* 满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” <br>
* <p>
* | 13
* | 11 29
* | 5 12 19 33
* | 3 7 n n 17 30 37
* | 6 18 31
* |---------- ---------- ----------
* 待查找节点 p q 在某一节点 C 的两侧,那么 C 即为 最近的公共祖先 <br>
* <b> 从根节点出发找孙子 左右为难时 就是公共祖先 </b> <br>
* 二叉搜索树中,假设 p.val < q.val, 若p、q 在 某一节点C两侧 ==>> p.val < C.val < q.val
*
* @param root
* @param p
* @param q
* @return
*/
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
TreeNode cur = root;
// 一头 扎进 p q 中间
while (true) {
if ((p.val < cur.val && q.val < cur.val)) {
cur = cur.left;
} else if (cur.val < p.val && cur.val < q.val) {
cur = cur.right;
} else break;
}
return cur;
}