目录
一.问题描述
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]
二.解题方法
递归算法
三.解题思路
由于树是二叉搜索树,那么可以利用二叉搜索树的性质,即左子树的结点的值都小于根结点,右子树的结点都大于根结点。那么可以分三种情况:
1.若p的值小于root的值,q的值大于根的值,那么root就是最近公共祖先。
2.若p的值和q的值都小于root的值,那么代表最近祖先一定在root的左子树中
3.若p的值和q的值都大于root的值,那么代表最近祖先一定在root的右子树中
2.3情况发生的话,只需要继续递归即可,而 1则是递归出口。
四.代码展示
struct TreeNode* lowestCommonAncestor(struct TreeNode* root, struct TreeNode* p, struct TreeNode* q) {
if (root == p || root == q) 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);
return root;
}