作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
题目描述:
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
1.对于该题的最近的公共祖先定义:对于有根树T的两个节点p、q,最近公共祖先LCA(T,p,q)表示一个节点x,满足x是p和q的祖先且x的深度尽可能大。在这里,一个节点也可以是它自己的祖先.
2.二叉搜索树是若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值; 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值
3.所有节点的值都是唯一的。
4.p、q 为不同节点且均存在于给定的二叉搜索树中。
数据范围:
3<=节点总数<=10000
0<=节点值<=10000
如果给定以下搜索二叉树: {7,1,12,0,4,11,14,#,#,3,5},如下图:
示例:
输入:
{7,1,12,0,4,11,14,#,#,3,5},1,12
返回值:
7
说明:
节点1 和 节点12的最近公共祖先是7
解题思路:
本题考察数据结构树的使用,寻找二叉搜索树的最近公共祖先。二叉搜索树特性:节点左侧均小于节点值,右侧均大于节点值。
1. 如果当前根节点与其中一值相同,则该节点是公共祖先。
2. 如果两个值一个大于根,一个小于根,则根节点为公共祖先。
3. 若两值均小于当前根节点,则以左子树为新的根节点继续判断;若均大于,则以右子树为新根。
测试代码:
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
class Solution {
public:
int lowestCommonAncestor(TreeNode* root, int p, int q) {
// 判空
if(root==nullptr)
return -1;
// 若节点有相同,则该节点是公共祖先
if(p==root->val||q==root->val)
return root->val;
// 分情况处理,注意二叉搜索树的特性:节点左侧均小于节点值,右侧均大于节点值
if(p>root->val){
// 二叉搜索树中一个大于一个小于,则中间节点是公共祖先
if(q<root->val)
return root->val;
// 若均大于,则以右子树为新的根节点,继续寻找
else
return lowestCommonAncestor(root->right, p, q);
}
else{
// 二叉搜索树中一个大于一个小于,则中间节点是公共祖先
if(q>root->val)
return root->val;
// 若均小于,则以左子树为新的根节点,继续寻找
else
return lowestCommonAncestor(root->left, p, q);
}
}
};