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


相关文章
|
12天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
30 5
|
1月前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
67 16
|
2月前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
26 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
2月前
|
Java C++
【数据结构】探索红黑树的奥秘:自平衡原理图解及与二叉查找树的比较
本文深入解析红黑树的自平衡原理,介绍其五大原则,并通过图解和代码示例展示其内部机制。同时,对比红黑树与二叉查找树的性能差异,帮助读者更好地理解这两种数据结构的特点和应用场景。
34 0
|
2月前
|
存储 算法
数据结构与算法学习十六:树的知识、二叉树、二叉树的遍历(前序、中序、后序、层次)、二叉树的查找(前序、中序、后序、层次)、二叉树的删除
这篇文章主要介绍了树和二叉树的基础知识,包括树的存储方式、二叉树的定义、遍历方法(前序、中序、后序、层次遍历),以及二叉树的查找和删除操作。
30 0
|
2月前
05(数据结构考研)树相关操作代码
05(数据结构考研)树相关操作代码
29 0
|
1月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
137 9
|
25天前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
24 1
|
28天前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。