首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

BST递归的问题(在C++中查找树的高度)

BST递归的问题是在C++中查找二叉搜索树(Binary Search Tree)的高度。二叉搜索树是一种特殊的二叉树,其中每个节点的值都大于其左子树中的任何节点的值,且小于其右子树中的任何节点的值。

要计算二叉搜索树的高度,可以使用递归的方法。递归是一种通过调用自身来解决问题的方法。

以下是一个完善且全面的答案:

二叉搜索树的高度是指从根节点到最远叶子节点的最长路径上的节点数。在C++中,可以使用递归的方式来计算二叉搜索树的高度。

首先,我们需要定义二叉搜索树的节点结构:

代码语言:txt
复制
struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

接下来,我们可以编写一个递归函数来计算二叉搜索树的高度:

代码语言:txt
复制
int getHeight(TreeNode* root) {
    if (root == nullptr) {
        return 0;
    }
    
    int leftHeight = getHeight(root->left);
    int rightHeight = getHeight(root->right);
    
    return max(leftHeight, rightHeight) + 1;
}

在这个递归函数中,我们首先判断当前节点是否为空。如果为空,说明已经到达叶子节点的下一层,返回0。否则,我们分别递归计算左子树和右子树的高度,并取两者中的较大值。最后,将较大值加1,即为当前节点所在子树的高度。

使用这个递归函数,我们可以计算任意二叉搜索树的高度。下面是一个示例用法:

代码语言:txt
复制
int main() {
    // 构建一个二叉搜索树
    TreeNode* root = new TreeNode(5);
    root->left = new TreeNode(3);
    root->right = new TreeNode(7);
    root->left->left = new TreeNode(2);
    root->left->right = new TreeNode(4);
    root->right->left = new TreeNode(6);
    root->right->right = new TreeNode(8);
    
    // 计算二叉搜索树的高度
    int height = getHeight(root);
    cout << "二叉搜索树的高度为:" << height << endl;
    
    // 释放内存
    delete root->left->left;
    delete root->left->right;
    delete root->right->left;
    delete root->right->right;
    delete root->left;
    delete root->right;
    delete root;
    
    return 0;
}

这个示例中,我们构建了一个简单的二叉搜索树,并计算了其高度。输出结果为:

代码语言:txt
复制
二叉搜索树的高度为:3

推荐的腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):提供弹性计算能力,满足各种业务需求。产品介绍链接
  • 腾讯云云数据库MySQL版:提供高性能、可扩展的关系型数据库服务。产品介绍链接
  • 腾讯云对象存储(COS):提供安全、稳定、低成本的云端存储服务。产品介绍链接
  • 腾讯云人工智能(AI):提供丰富的人工智能服务和解决方案,助力业务创新。产品介绍链接
  • 腾讯云物联网(IoT):提供全面的物联网解决方案,帮助连接和管理物联设备。产品介绍链接
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Python实现二分查找递归

1 问题 如何在Python实现二分查找递归? 2 方法 二分查找法又称折半查找法,用于预排序列表查找问题。...要在排序列表alist查找元素t,首先,将列表alist中间位置项与查找关键字t比较,如果两者相等,则查找成功;否则利用中间项将列表分成前、后两个子表,如果中间位置项目大于t,则进一步查找前一子表,...重复以上过程,直到找到满足条件记录,即查找成功;或者直到子表不存在为止,即查找不成功。...return_binarySearch(key,a,mid+1,hi) #递归查找后一子表else: #中间位置项目等于查找关键字return mid #查找成功,返回下标位置...__=='__main__':main() 3 结语 对于如何在Python实现二分查找问题,经过测试,是可以实现python还有很查找法,比如顺序查找法、冒泡排序法等。

15010

AVL:解决BST可能导致长链问题

BST存在问题 BST性质有可能导致所有的数据都插在了同一个链路上,导致没有一个节点有左子树,都是右子树,像是一个链表,失去了它lgn性质 AVL性质 AVL是作者名字缩写 每个左子树高度与右子树高度差值不大于...1 如果是AVL+BST需要只需要在BST基础上加上AVL性质,AVL本身需要去维护高度 image.png 一个AVL,除去根节点这层,至少包含左右两部分为:一边是高度为h-1,另一边是高度为...h-2 image.png AVL+BST插入 插入过程,一旦出现层级超过1情况,需要进行旋转,而对应出现2层高度差别,只会出现如下4种 情况1: 1 \ 2 \..._left_roate(node) node = node.parent 复制代码 左旋 def _left_roate(self,node): '''当前节点右节点高度-左节点高度>=2 从上到下..._update_height(node) 复制代码 右旋 def _right_roate(self,node): '''当前节点左节点高度-右节点高度>=2 右旋表示左边节点高 ''' pivot

44120

二叉查找递归操作

昨天同学去參加阿里巴巴面试,被问到二叉一些基本问题,分享一下: 1.怎样非递归dfs求得深度 2.怎样非递归bfs求得深度 *3.怎样非递归地中前后序遍历二叉查找。...二叉写过不下十次了。可是基本每次都是用递归来写。一时间问道还不能一下写出来。 问题二还是比較好写,一的话可能须要细致想想,可是假如是面试的话。可能我一时也说不出来。...t.travel_dg_suf(); cout << "\n非递归递归后序遍历:\n"; t.travel_suf(); cout << "\n递归高度\n";...cout << t.get_depth_dg(); cout << "\n非递归dfs求高度\n"; cout << t.get_depth_dfs(); cout <<..."\n非递归bfs求高度\n"; cout << t.get_depth_bfs(); } 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/115773

40040

每日一题C++版(高度

编程是很多偏计算机、人工智能领域必须掌握一项技能,此编程能力在学习和工作起着重要作用。...高度 题目描述 现在有一个由有序数对组成节点都是用数字表示,现在给定这棵树上所有的父子关系,求这棵高度 输入描述: 输入第一行表示节点个数n(1 ≤ n ≤ 1000,节点编号为...如果可以使用容器将同一高度节点放在一个容器内,这个高度节点子节点放在下一层绒球内。父节点放在上一层容器。由于我们不能总是先发现父节点,因此这个容器也会在首段插入数据。...因此我们需要使用两端插入数据比较快容器,因此我们选用list容器。而这个容器内元素也应该是一个容器(为了方便我们插入同样高度新节点)。...这样首先我们就在每一层寻找父节点,如果找到,就将其子节点插入(存入)下一层;如果没有找到,我们就在每一层寻找子节点,如果找到,就将其父节点插入(存入)上一层,并且将这个节点从需要插入“数据里面删除

37620

漫画:二叉系列 第四讲(BST查找

在上一节,我们学习了二叉搜索。那我们如何在二叉搜索查找一个元素呢?和普通二叉又有何不同?我们将在本节内容中进行学习! 下面看题:??...01 第700题:二叉搜索搜索 第700题:给定二叉搜索BST根节点和一个值。你需要在BST中找到节点值等于给定值节点。返回以该节点为根子树。如果节点不存在,则返回 NULL。...3.它左右子树也分别为二叉搜索 如下图就是一棵典型BST: 03 图解分析 假设目标值为 val。...根据BST特性,我们可以很容易想到查找过程 如果val小于当前结点值,转向其左子树继续搜索; 如果val大于当前结点值,转向其右子树继续搜索; 如果已找到,则返回当前结点。 很简单,不是吗?...无论是不理解还是有别的解题思路都可以评论区进行留言~ 如果已完全掌握,一定记得点击右方“在看”进行每日打卡! 还没进群小伙伴抓紧啦!

42920

打牢算法基础,从动手出发!

算法计算机领域重要性,就不用我多说了,每个人都想要学算法,打牢算法基础,可是不知道如何做,今天我来推荐一波学习思路。...、四种遍历方式递归与非递归bst中最大与最小节点,删除节点原则,拓展二分查找法与基于floo、ceil实现,当bst退化为链表时候对应顺序查找表实现,顺序查找表与二分搜索效率对比。...补充 顺序查找表实现 二分查找法实现 基于floor与ceil二分查找法实现 二分搜索实现 二分搜索测试 集合与映射 映射接口 基于底层为二分搜索映射 基于底层为链表映射 LeetCode804...问题 拓展 基于底层为顺序查找映射 集合接口 基于底层为二分搜索集合 基于底层为链表集合 LeetCode804问题 拓展 基于底层为顺序查找集合 集合 学习要点:集合接口定义、二分搜索与链表集合效率对比...字典实现 LeetCode211题 LeetCode677题 并查集 学习要点:quickfind、基于高度优化并查集、基于大小(只是当前父亲节点+孩子节点总数)优化、基于rank(深度

53230

Python递归与二分查找

认识递归 递归定义——一个函数里再调用这个函数本身 为了防止递归无限进行,通常我们会指定一个退出条件 递归最大深度——998 #递归基本形式 def foo(n): print(n)...不推荐修改这个默认递归深度,因为如果用998层递归都没有解决问题是不适合使用递归来解决。...不推荐修改这个默认递归深度,因为如果用998层递归都没有解决问题是不适合使用递归来解决。...我们只需要考虑如果有64层,先将A柱上63层移动到B柱上,然后将A柱第64个移动到C柱上,然后 将B柱上63层移动到C柱上即可。 那怎么把63层都移到B柱上,这个问题可以用上面相同方法解决。...如果想在列表查找某个数字,可以排序后从中间开始查找 图片 l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88

60110

二叉查找

.左右子树也分别为二叉查找; 4.等于情况只能出现在左子树或右子树某一侧,一般二叉查找无重复节点。...5.二叉查找序遍历从小到大顺序,故又名二叉排序。...二叉查找插入节点复杂度为O(h),h为高度,若二叉查找较为平衡,则平均查找复杂度为log(n) 递归实现 void BST_insert(TreeNode *node, TreeNode *insert_node...查找数值value是否二叉查找中出现: 如果value等于当前查看node节点 值:返回True 如果value节点值小于当前node节点值: 1.如果当前节点值有左子树,继续左子树查找该值...;否则,返回假 否则(value)节点值大于当前node节点值: 如果当前节点值有右子树,继续右子树查找该值;否则,返回假 二叉查找查找数值复杂度为O(h),h为高度,若二叉查找较为平衡

32120

【43期】盘点那些必问数据结构算法题之二叉基础

;(有些书里面定义为BST不能有相同值结点,本文将相同值结点插入到右子树) 任意结点左、右子树也分别为二叉查找; 本文接下来会从定义,二叉搜索增删查以及二叉递归和非递归遍历进行整理。...二叉搜索跟二叉可以使用同一个结构,只是插入或者查找时会有不同。...2 基本操作 接下来看看二叉和二叉查找一些基本操作,包括BST插入结点,BST查找结点,BST最大值和最小值,二叉结点数目和高度等。...二叉查找(BST)特有的操作都在函数前加了 bst 前缀区分,其他函数则是二叉通用。 1) 创建结点 分配内存,初始化值即可。...这里值得一提是层序遍历,先是计算了二叉高度,然后调用辅助函数依次遍历每一层结点,这种方式比较容易理解,虽然时间复杂度上会高一些。

35410

C++】二叉前序序后序非递归实现

把访问左路节点右子树看成一个子问题,就可以完整递归访问了。 先定义栈st存放节点、v存放值,TreeNode* cur,cur初始化为root。...弹出栈顶元素top,把top->right赋值给我们cur,就可以转化成子问题去访问左路节点右子树了。 栈st不为空说明此时还有左路节点右子树还没访问,cur不为空说明此时还有要去访问。...} return v; } }; ---- 二叉序遍历 序遍历是左、根、右。...我们定义一个栈,栈里面取到一个节点时:右子树是否访问过,如果没有访问,迭代子问题访问,如果访问过了,则访问这个根节点,pop出栈 如果top右子树为空或者右子树已经访问过了(上一个访问节点是右子树根...、序遍历、后序遍历递归遍历三种方法都是类似的,差别在于访问栈顶元素时机不同,访问控制不同。

15510

【算法】论平衡二叉(AVL)正确种植方法

二叉搜索查找原理和二分查找类似,就是借助于它本身结构,遍历查找过程跳过一些不必要结点比较,从而实现高效查找BST其他API也是借助了这一优势实现性能飞跃。...这里我们可以很明显地看到平衡二叉优势所在: 使得查找平均深度降低, 优化各个API性能开销 AVL和普通BST区别在于动态方法 平衡二叉和普通二叉查找区别主要在于动态方法!...二叉, 我们为每个结点定义了平衡因子这个属性。 平衡因子: 某个结点左子树高度减去右子树高度得到差值。 平衡二叉(AVL): 所有结点平衡因子绝对值都不超过1。...方法和delete方法解析: 【算法】二叉查找BST)实现字典API 插入方法 在看代码前可以先看下对二叉查找put方法解析 二叉查找put方法 平衡查找put方法   /**   ...(x); // 沿递归路径从下往上, 检测当前结点是否失衡,若失衡则进行平衡化     return x;   } 删除方法 删除方法比较复杂,在看代码前可以先看下对二叉查找put方法解析 二叉查找

83820

【算法】论平衡二叉(AVL)正确种植方法

二叉搜索查找原理和二分查找类似,就是借助于它本身结构,遍历查找过程跳过一些不必要结点比较,从而实现高效查找BST其他API也是借助了这一优势实现性能飞跃。...这里我们可以很明显地看到平衡二叉优势所在: 使得查找平均深度降低, 优化各个API性能开销 AVL和普通BST区别在于动态方法 平衡二叉和普通二叉查找区别主要在于动态方法!...二叉, 我们为每个结点定义了平衡因子这个属性。 平衡因子: 某个结点左子树高度减去右子树高度得到差值。 平衡二叉(AVL): 所有结点平衡因子绝对值都不超过1。...方法和delete方法解析: 【算法】二叉查找BST)实现字典API 插入方法 在看代码前可以先看下对二叉查找put方法解析 二叉查找put方法 平衡查找put方法   /**   ...(x); // 沿递归路径从下往上, 检测当前结点是否失衡,若失衡则进行平衡化     return x;   } 删除方法 删除方法比较复杂,在看代码前可以先看下对二叉查找put方法解析 二叉查找

993110

数据结构–查找专题

记作:ST={a1,a2,…,an} ● 关键字: 可以标识一个记录数据项 ● 主关键字: 可以唯一地标识一个记录数据项 ● 次关键字: 可以识别若干记录数据项 查找—-根据给定某个关键字值,查找确定一个其关键字等于给定值记录或数据元素...静态查找: 查询某个特定元素,检查某个特定数据元素属性,不插入新元素或删除元素(记录) 。 动态查找: 查找过程,同时插入查找不存在数据元素(记录)。...有序” (2)设n个记录分为b个块,每块记录数s=n/b ● 查找方法 (1)顺序查找(或折半查找)索引表 确定k值所在块号或块首地址 (2)某一块顺序查找 ● 最佳分块 s=√n b=√n...小往左走,大往右走,遇到NULL就插入 ASL计算:同查找 存储结构:跟二叉一样 查找算法:大往右,小往左,找到了返回,遇到NULL就失败 插入算法: 删除算法:二叉排序删除一个结点时...3、被删结点左、右子树都存在,可以右子树寻找序下第一个结点(关键值最小),用它值填补到被删结点中,再来处理这个结点删除问题

44220

【每日算法Day 76】经典面试题:序遍历下一个元素,5大解法汇总!

+递归 首先本题中二叉还是个二叉搜索,也就是序遍历是单调递增,所以我们可以利用这个性质来简化查找过程。...如果结点 p 值大于等于 root 值,说明 p 后继结点在 root 右子树,那么就递归到右子树查找。...如果左子树没有找到后继结点,那就说明 p 右儿子为空,那么 root 就是它后继结点。 BST+非递归 如果 p 有右儿子,那么它后继结点就是右子树最左边儿子。...一般+递归 那如果是一般二叉序遍历就不满足单调递增了,这时候我们就只能找出序遍历结点顺序,然后才能得到 p 后继结点。...所以我们直接采用递归来做序遍历就行了,序遍历结果保存下来,最后取 p 下一个结点。 一般+非递归 当然还可以采用栈来做序遍历,这样就是非递归了。同样结果保存下来,最后取 p 下一个结点。

39630

4.5.1 二叉排序

若二叉排序非空,将给定值与根结点关键字比较,若相等,则查找成功;若不等,则当根结点关键字大于给定关键字时,根结点左子树查找,否则在根结点右子树查找。...二叉排序递归查找算法: BSTNode *BST_Search(BiTree T,ElemType key,BSTNode *&p){ //查找函数返回指向关键字为key结点指针,若不存在,则返回...,而是查找过程,当不存在关键字等于给定值结点时再进行插入。...int BST_insert(BiTree &T,keyType k){ //二叉排序T插入一个关键字为k结点 if(T==null){//原为空,新插入记录为根结点 T=(BiTree...while (i<n){//依次将每个元素插入 BST_insert(T,str[i]); i++; } } 5、二叉排序删除 二叉排序删除一个结点时,不能把以该结点为根子树结点都删除

50430

实现一个二叉搜索(JavaScript 版)

二叉搜索是二叉一种,二叉搜索每个父节点键值要大于左边子节点小于右边子节点。下图展示一颗二叉搜索。 ?...(32); bST.insert(40); console.dir(bST, { depth: 4 }) 二叉搜索查找节点 JavaScript 我们可以通过 hasOwnProperty...二叉搜索销毁 在上面最后讲解了二叉搜索后序遍历,这里讲下它实际应用, C++ 等面向对象编程语言中可以定义析构函数使得某个对象所有引用都被删除或者当对象被显式销毁时执行,做一些善后工作。...这就是二叉搜索存在问题,它可能是极端,并不总是向左侧永远是一个平衡二叉,如果我顺序化插入形状就如右侧所示,会退化成一个链表,试想如果我需要查找节点 40,右图所示树形需要遍历完所有节点...为了解决这一问题,可能需要一种平衡二叉搜索,常用实现方法有红黑、AVL 等。

1.4K30

详解数据结构——二叉排序

目录 二叉排序 二叉排序查找 二叉排序插入 二叉排序删除 查找时间效率分析 ---- 二叉排序 二叉排序,又称二叉查找BST,Binary Search Tree...rchild; //大于,右子树查找 } return T; } //二叉排序中找到值为key结点--递归实现 ,时间复杂度最坏O(h) h 是高度 BSTNode...代码 最坏时间复杂度O(h) ,高度 //二叉排序插入关键字为k新结点(递归实现) int BST_Insert(BSTree &T, int k){ if(T==NULL){.../插入到T右子树 return BST_Insert(T->rchild,k); }  二叉排序构造 //按照str[]关键字序列建立二叉排序 void Creat_BST(BSTree...查找时间效率分析 查找长度——查找运算,需要对比关键字次数称为查找长度,反应查找操作时间复杂度 查找成功平均查找长度  查找失败平均查找长度

48040
领券