题目描述:
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
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); } } };