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

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

题目描述:

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。


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


相关文章
|
8天前
|
存储 C++ 索引
c++数据结构
c++数据结构
19 3
|
13天前
|
算法 测试技术 C++
【C++】map&set的底层结构 -- AVL树(高度平衡二叉搜索树)(下)
【C++】map&set的底层结构 -- AVL树(高度平衡二叉搜索树)(下)
|
13天前
|
C++ 容器
【C++】map&set的底层结构 -- AVL树(高度平衡二叉搜索树)(上)
【C++】map&set的底层结构 -- AVL树(高度平衡二叉搜索树)(上)
|
7天前
|
存储 C语言 Python
从C语言到C++_24(二叉搜索树)概念+完整代码实现+笔试题(下)
从C语言到C++_24(二叉搜索树)概念+完整代码实现+笔试题
27 3
|
7天前
|
C语言
从C语言到C++_24(二叉搜索树)概念+完整代码实现+笔试题(中)
从C语言到C++_24(二叉搜索树)概念+完整代码实现+笔试题
13 1
|
7天前
|
算法 测试技术 C语言
从C语言到C++_24(二叉搜索树)概念+完整代码实现+笔试题(上)
从C语言到C++_24(二叉搜索树)概念+完整代码实现+笔试题
17 0
|
12天前
|
存储
数据结构(树)
数据结构(树)
22 1
|
13天前
|
容器
【数据结构】二叉搜索树的原理及其实现
【数据结构】二叉搜索树的原理及其实现
|
14天前
|
存储 分布式数据库
【数据结构】树和二叉树
【数据结构】树和二叉树
|
15天前
|
存储 移动开发 算法
数据结构与算法⑩(第四章_上)树和二叉树和堆的概念及结构(下)
数据结构与算法⑩(第四章_上)树和二叉树和堆的概念及结构
28 0