问题描述
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x
的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉搜索树: root ={6,2,8,0,4,7,9,#,#,3,5}
所有节点的值都是唯一的。 p、q 为不同节点且均存在于给定的二叉搜索树中。
样例
样例 1:
输入:
{6,2,8,0,4,7,9,#,#,3,5}
2
8
输出: 6
解释: 节点 2 和节点 8 的最近公共祖先是 6。
样例 2:
输入:
{6,2,8,0,4,7,9,#,#,3,5}
2
4
输出: 2
解释: 节点 2 和节点 4 的最近公共祖先是 2, 因为根据定义最近公共祖先节点可以为节点本身。
问题分析
可以采用分治 的思想,判断左右子树中是否有p,q的共同祖先,若没有则返回空值,若有则返回祖先值。对每一层执行相同操作,即判断左右儿子是否有和p,q相同的值,先判断左儿子再判断右儿子,若两者都相同则返回左右儿子的父节点,若只有左相同,则返回左孩子,若只有右相同则返回右孩子。
算法代码如下
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param root: root of the tree
* @param p: the node p
* @param q: the node q
* @return: find the LCA of p and q
*/
TreeNode * lowestCommonAncestor(TreeNode * root, TreeNode * p, TreeNode * q) {
// write your code here
if(root==nullptr)
return nullptr;
if(root==p||root==q)
{
return root;
}
TreeNode *l =lowestCommonAncestor(root->left,p,q);
TreeNode *r =lowestCommonAncestor(root->right,p,q);
if(l!=nullptr&&r!=nullptr)
return root;
if(l!=nullptr)
return l;
if(r!=nullptr)
return r;
return nullptr;
}};