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

寻找BST…的最小深度findHeight函数不起作用

基础概念

二叉搜索树(Binary Search Tree,BST)是一种特殊的二叉树,其中每个节点的值都大于其左子树中的任何节点值,并且小于其右子树中的任何节点值。最小深度是从根节点到最近的叶子节点的最短路径上的节点数量。

相关优势

  • 查找效率:BST的平均查找时间复杂度为O(log n),在最坏情况下为O(n)。
  • 插入和删除:BST的插入和删除操作也相对高效,平均时间复杂度为O(log n)。

类型

  • 普通BST:标准的二叉搜索树。
  • 平衡BST:如AVL树和红黑树,通过保持树的平衡来确保操作的高效性。

应用场景

  • 数据库索引:用于快速查找和排序数据。
  • 文件系统:用于组织和管理文件。
  • 编译器符号表:用于存储变量和函数的信息。

问题分析

findHeight函数不起作用可能有以下几种原因:

  1. 逻辑错误:函数内部的逻辑可能不正确,导致无法正确计算最小深度。
  2. 边界条件:函数可能没有正确处理空树或只有一个节点的树。
  3. 递归或迭代错误:如果使用递归或迭代方法,可能存在栈溢出或无限循环的问题。

解决方案

以下是一个正确的findHeight函数的实现示例:

代码语言:txt
复制
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def findHeight(root):
    if not root:
        return 0
    left_height = findHeight(root.left)
    right_height = findHeight(root.right)
    return min(left_height, right_height) + 1

# 示例用法
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)

print(findHeight(root))  # 输出: 2

参考链接

进一步优化

如果需要处理大规模数据,可以考虑使用迭代方法来避免递归带来的栈溢出问题:

代码语言:txt
复制
def findHeightIterative(root):
    if not root:
        return 0
    
    queue = [(root, 1)]
    min_depth = float('inf')
    
    while queue:
        node, depth = queue.pop(0)
        if not node.left and not node.right:
            min_depth = min(min_depth, depth)
        if node.left:
            queue.append((node.left, depth + 1))
        if node.right:
            queue.append((node.right, depth + 1))
    
    return min_depth

# 示例用法
print(findHeightIterative(root))  # 输出: 2

通过以上方法,可以确保findHeight函数能够正确计算二叉搜索树的最小深度。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 二叉搜索树这些你都会了吗?

    添加新元素 这里用到递归性要好实现一些,递归要先考虑递归终止条件,然后再书写递归函数。...遍历操作 深度优先遍历 深度优先遍历基本思想:对每一个可能分支路径深入到不能再深入为止,而且每个结点只能访问一次。深度优先遍历非递归通用做法是采用栈。...要特别注意是,二分搜索树深度优先遍历比较特殊,可以细分为前序遍历、中序遍历、后序遍历。...删除节点 删除节点比较麻烦,这里进行拆解 删除最大最小值 先寻找二分搜索树最小(大)元素,看改节点左(右)子树是否为空,若为空,则为最小(大)元素 再进行删除,1,该节点无左右子树,自接进行删除 2,...该节点有左(右)子树,删除后进行拼接(类似于链表删除节点拼接) // 寻找二分搜索树最小元素 public E minimum(){ if(size == 0)

    48110

    鸡蛋掉落(动规找最优BST根节点 + 将解作为状态)

    动态规划(二分搜索优化,5%beat,1400ms) 3 动态规划(将解作为状态,100%beat,0ms) 致谢 1 动态规划(递归超时) 【状态】:①第i层扔碎了;②第i层扔没碎 【dp函数含义...n 【状态转移】 minCont表示N课BST树中最小深度BST深度值(在N个点中找最佳切分点) minCont = min[minCont, max(第i棵BST左分支depth, 第i棵BST右分支...树中最小深度BST深度值(在N个点中找最佳切分点) // minCont = min[minCont, max(第i棵BST左分支depth, 第i棵BST右分支depth)...; } }; 2 动态规划(二分搜索优化,5%beat,1400ms) 具体定义和上述相同,仅通过二分搜索加快速度,最值取在中间位置附近 【状态】:①第i层扔碎了;②第i层扔没碎 【dp函数含义...;②第i层扔没碎 【dp函数含义】:剩余k个鸡蛋,最少扔蛋m次时,需要楼层数为dp[k][m] = n 【状态转移】: dp[k][minCont] = dp[k][minCont - 1] + dp

    49430

    ​LeetCode刷题实战450:删除二叉搜索树中节点

    node reference of a BST and a key, delete the node with the given key in the BST....递归函数,有两个要点要理解,一个是递归函数作用,二是它返回结果是什么。这道题里,这个递归函数作用就是 删除一棵树里目标节点,返回是这棵修改后根节点root。...(启示:说到 二叉搜索树BST时,不仅要想到中序遍历结果是排好序,还要想到可以递归,有点像二分查找模式寻找目标值,提高效率) 删除节点: 经过上一步递归过程,找到了key,而且key是要调整这个子树根节点...调整子树: 这部分用到两个子函数: def successor(root): # 代表中序遍历序列后一个节点,即比当前节点大最小节点 root = root.right...根节点有右子树,继承节点就选择 它后一个节点(比目标节点大最小节点)。

    32920

    文心一言 VS 讯飞星火 VS chatgpt (149)-- 算法导论12.2 4题

    然后,我们使用这些函数来创建一棵二叉搜索树,并检查具有两个子节点节点前驱和后继是否有子节点。 这个代码没有具体实现查找前驱和后继逻辑,但你可以根据需要来实现这部分代码。...基于这些特性,我们可以考虑如何找到一个给定节点后继和前驱。 后继节点 在二叉搜索树中,一个节点 x 后继节点是指比 x 大最小节点。为了找到后继节点,我们可以通过以下步骤进行: 1....如果 x 有一个右子树,则 x 后继是其右子树中最小节点。 2. 如果 x 没有右子树,我们需要沿着父节点回溯,直到找到一个节点 y 是其父节点左子节点。这样,y 就是 x 后继。...findSuccessor函数用于寻找给定节点后继节点,而findPredecessor函数则用于寻找给定节点前驱节点。...我们创建了一个二叉搜索树,并分别使用findSuccessor和findPredecessor函数寻找节点2后继节点和节点6前驱节点。

    13020

    二分搜索树(Binary Search Tree)

    层序遍历   层序遍历和前面三种遍历方式都不一样,前、中、后序遍历本质上都是深度优先遍历,在进行前、中、后序遍历时,会先一直走到二分搜索树叶子节点,也就是最大深度,而我们层序遍历,本质上是一种广度优先遍历...,我们可以先研究如何实现删除二分搜索树最大值和最小值,当然我们得先找到这棵二分搜索树最大值和最小值,查找方法如下: //寻找二分搜索树中最大元素 -- 递归获取 public E maxNum...(node.right); } //寻找二分搜索数中最小元素 -- 递归法 public E minNum(){ if (size == 0) //...,我们可以写一个简单测试用例,来验证下我们删除最大值和删除最小值操作是否正确: public static void main(String[] args) { BST<Integer...bst.isEmpty()){ //从二分搜索树中删除最小元素所在节点,并拿到该最小元素 Integer minNum = bst.removeMinNum

    14410

    数据结构简单复习

    目录 环形队列插入、删除原理 BST(二叉查找树) 遍历二叉树 哈夫曼树 大/小顶堆 存储序列 左孩子右兄弟树与森林 快速排序 归并排序 堆排序 闭哈希、开哈希 2-3树 深度优先与广度优先 最短路径长度与最小代价生成树...插入 先判断队列是否已满,如果还没满,rear=(rear+1)%n 删除 先判断队列是否为空,如果不为空,front=(front+1)%n BST(二叉查找树) BST上节点左孩子值总是小于该结点...闭哈希( Closed Hashing ) 闭哈希遇到不同关键字处于同一位置情况,会确定下一个可能存储位置,其中最简单一种是线性探测,当哈希函数计算出位置存放了别的数据时,依次往后寻找。...Prim算法最小代价生成树 子图开始只包含一个顶点,一步步地向子图添加顶点和边,不过每次都在子图连接点中寻找离这个子图最近点。...Kruskal算法最小代价生成树 初始状态所有顶点都是独立子图,寻找连边权重最小且分别属于两个子图顶点,将两个子图通过这条连边连接在一起,重复这个过程直到只有一个子图,既最小代价生成树。

    97820

    【数据结构与算法】详解什么是树结构,并用代码手动实现一个二叉查找树

    兄弟结点 具有同一个父节点所有结点为兄弟结点 结点层次 设定根结点所在层次为1,其它结点层次为其父节点层次+1 树深度所有结点中最大层次为该树深度 路径 从某个结点沿着树层级关系到达另一个结点之间路线...因为该树结构最大层次为 3,所以该树深度就为 3 对于路径,假设我们要找到 结点A 到 结点E 路径,我们只需要沿着树层次结构走就可以了,如图红线所标的路线就称为 结点A 到 结点E 路径...,即除了最后一层叶子结点外,其余结点都有两个子结点,因此满二叉树每一层结点个数都达到了最大值,其余类型二叉树每一层结点个数只会小于或等于它 我们可以自己来验证一下,下图时一个树深度为 3 满二叉树...console.log(bst.root) 因为这里我们还没有封装遍历函数,因此可以靠浏览器打印来查看二叉查找树是否正确,结果如下 ?...第二种选择自然就是去 结点10 右子树里去找了,找到右子树里 key 值最小一个结点,在本例中,最小结点肯定是 结点13 了,然后我们也一样用 结点13 代替 结点10 位置,这样就能保证该位置上结点

    67130

    文心一言 VS 讯飞星火 VS chatgpt (160)-- 算法导论12.4 2题

    为了实现这一点,我们可以使用一个辅助函数来生成一个深度为depth完美二叉树,然后将剩余节点按照中序遍历顺序插入到树中。...平均深度为O(lgn),高度为Ω(lgn)。根据BST性质,我们可以得出树高度一个渐近上界为O(n)。...根据二叉搜索树性质,对于包含 n 个节点完美平衡二叉搜索树,其高度 h 是 log2(n+1)(这是因为完美平衡二叉树中,每个节点左右子树大小都相差不超过1,这样可以使得树高度最小)。...然而,树高度被限制为w(lgn),这意味着整个树高度不能超过w(lgn)。这是一种特殊情况,其中树高度相对于平均深度被限制。所以我们需要寻找一个渐近上界来描述这棵树高度。...在这里插入图片描述 kimi: 在这个问题中,我们需要描述一棵具有特定属性二叉搜索树(BST),即树中节点平均深度为 O(logn),但树高度为 O(ω(logn)),其中 ω 是一个非常慢增长函数

    14020

    文心一言 VS 讯飞星火 VS chatgpt (160)-- 算法导论12.4 2题

    为了实现这一点,我们可以使用一个辅助函数来生成一个深度为depth完美二叉树,然后将剩余节点按照中序遍历顺序插入到树中。...平均深度为O(lgn),高度为Ω(lgn)。根据BST性质,我们可以得出树高度一个渐近上界为O(n)。...根据二叉搜索树性质,对于包含 n 个节点完美平衡二叉搜索树,其高度 h 是 log2(n+1)(这是因为完美平衡二叉树中,每个节点左右子树大小都相差不超过1,这样可以使得树高度最小)。...然而,树高度被限制为w(lgn),这意味着整个树高度不能超过w(lgn)。这是一种特殊情况,其中树高度相对于平均深度被限制。所以我们需要寻找一个渐近上界来描述这棵树高度。...在这里插入图片描述 kimi: 在这个问题中,我们需要描述一棵具有特定属性二叉搜索树(BST),即树中节点平均深度为 O(logn),但树高度为 O(ω(logn)),其中 ω 是一个非常慢增长函数

    12520

    5.4删除二叉搜索树任意元素

    寻找规则: 寻找需要被删除节点58(d)后继所有元素中,离 58 最近且比 58 大节点,在本例中为59这个节点【即右子树中最小值】,记为s,如下图所示: ?...删除步骤: (1)从d右子树中删除最小值,将删除最小值s后d右子树, 变为d后继节点s右孩子,如下图所示: ?...函数,在5.3节中已经实现,此处同样也把代码列出来: // 寻找二分搜索树最小元素 public E minimum() { if (size == 0) {...return ninNode.e; } // 返回以node为根二分搜索树最小值所在节点 private Node minimum(Node node)...return minimum(node.left); } 源码地址 https://github.com/FelixBin/dataStructure/blob/master/src/BST/BST.java

    57540

    野生前端数据结构基础练习(7)——二叉树

    查找 3.1查找给定值 TIP:实际上就是二分法查找 3.2查找最小值 TIP:BST中最左侧节点。 3.3查找最大值 TIP:BST中最右侧节点。...删除节点 TIP:主要注意删除同时包含左右孩子节点节点时逻辑,由BST插入规则可以知道,节点右子树中所有的节点都是大于当前节点值,所以右子树中找出最小值是大于当前节点左子树上所有值,所以将其上浮至当前待删除节点位置...为BST类增加一个新方法min( ),返回最小值。...写一段程序,读入一个较大文本文件,并将其中单词保存到BST中,显示每个单词出现次数 四.习题思路 在BST构造函数中增加一个count属性,在增删节点成功时修改count值实现计数即可。...关于二叉树 二叉树是非常重要数据结构,书中介绍只是最基本知识,更进一步学习会涉及二叉树数学特性,限制更多性能也更优平衡二叉树,满二叉树,红黑树等等,以及相关深度优先和广度优先算法,路还很长

    71220

    LwwtCode 173:二叉搜索树迭代器 Binary Search Tree Iterator

    你将使用二叉搜索树根节点初始化迭代器。 Implement an iterator over a binary search tree (BST)....Your iterator will be initialized with the root node of a BST. 调用 next() 将返回二叉搜索树中下一个最小数。...你可以假设 next() 调用总是有效,也就是说,当调用 next() 时,BST 中至少存在一个下一个最小数。...O(n),其中 n 为结点数,而不是 二叉树深度 O(logn) 另一种方法是维护一个栈,递归入栈二叉树左子结点。...每次调用 next() 函数时,出栈一个结点,返回其结点值。并且如果该结点存在右子结点,则递归入栈该结点左子树左子结点,准备下一次操作。空间复杂度为栈容量,最大为二叉树最大深度

    47330

    LeetCode 783 & 530 Distance Between BST Nodes

    783.Minimum Distance Between BST Nodes ---- Given a Binary Search Tree (BST) with the root node root,...解法一: 寻找到比root节点小节点中最大值,和比root节点大节点中最小值。通过这三个值比较得出最小diff,递归下去。此方法并没有完全利用到BST特性,因此,效率不高。...: 我们知道,对于一个BST来说,中序遍历得到顺序就是节点从小到大顺序排列,因此可以采用一个变量prev,记录上一个节点,采用当前节点值减去上一个节点值(prev),就可以得到相邻排序两个节点差值...,一次循环下去,就可以方便得出最小值。...,为Integer.MAX_VALUE 由于第一个节点(最小节点)之前,prev是null,因此,这里会有一个判断,只有当prev不为空时候进行相减。

    55500

    文心一言 VS 讯飞星火 VS chatgpt (264)-- 算法导论20.1 3题

    文心一言: 在二叉搜索树(BST)中,查找一个节点 x 后继(即大于 x 最小节点)或前驱(即小于 x 最大节点)时,即使 x 不在树中,也可以遵循一定规则来找到这些节点。...如果 x 大于树中所有节点,则函数返回 nil。 讯飞星火: 在二叉搜索树中,一个节点后继是比它大最小节点。...2.在这些大于 x 节点中,找到最小一个,即为 x 后继。 由于 x 不在树中,我们不能直接访问它右子树来找后继(因为在BST中,一个节点后继通常是其右子树中最左节点)。...在这里插入图片描述 kimi: 在二叉搜索树(BST)中,查找一个不存在节点 x 后继(即大于 x 最小值)或前驱(即小于 x 最大值)可以通过以下步骤实现: 1....然后,我们实现了 findMin 和 findMax 辅助函数来查找树中最小值和最大值节点。

    9310

    XGBoost学习经历及动手实践

    XGBoost公式2 现在我们对手稿内容进行详细讲解: 1. 优化目标: ? 我们任务是找到一组树使得OBj最小,很明显这个优化目标OBj可以看成是样本损失和模型复杂度惩罚相加组成。...根据决策树生成策略,再每次分裂节点时候我们需要考虑能使得损失函数减小最快节点,也就是分裂后损失函数减去分裂前损失函数我们称之为Gain: ? Gain越大越能说明分裂后目标函数值减小越多。...划分到桶(bucket)中,接着对每个桶内样本统计值G、H进行累加,最后在这些累计统计量上寻找最佳分裂点。 ? 论文近似算法伪代码 XGBoost动手实践: 1....范围:[0,∞] max_depth:默认= 6,一棵树最大深度。增加此值将使模型更复杂,并且更可能过度拟合。...'max_depth': 12, # 构建树深度,越大越容易过拟合 'lambda': 2, # 控制模型复杂度权重值L2正则化项参数

    1.5K21
    领券