剑指offer(C++)-JZ68:二叉搜索树的最近公共祖先(数据结构-树)

作者:翟天保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},如下图:

扫描二维码关注公众号,回复: 14268363 查看本文章

示例:

输入:

{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);
        }
        
    }
};

猜你喜欢

转载自blog.csdn.net/zhaitianbao/article/details/125263328