当前位置: 首页 > 知识库问答 >
问题:

Easy Leetcode:BST深度优先搜索存在堆栈溢出错误

麹飞航
2023-03-14

我正在处理一个Leetcode问题,可以在这里找到:https://leetcode.com/problems/minimum-distance-between-bst-nodes/

问题:给定一个具有根节点根的二叉搜索树(BST),返回树中任何两个不同节点的值之间的最小差异。

例子:

输入:root=[4,2,6,1,3, null, null]输出:1解释:注意root是TreeNode对象,而不是数组。

给定的树[4,2,6,1,3,null,null]由下图表示:

      4
    /   \
  2      6
 / \    
1   3  

虽然此树中的最小差异为1,但它发生在节点1和节点2之间,也发生在节点3和节点2之间。

注意:我已经实现了前序遍历,但是我的代码遇到了堆栈溢出错误,有人能帮忙指出逻辑错误在哪里吗?

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def minDiffInBST(self, root):
        min_value = float('inf')

        def helper(node, min_value):
            print(node.val, "and", min_value)
            # if root is None
            if not root: 
                return None

            if node.left:
                min_value = min(min_value, node.val - node.left.val)
            if node.right:
                min_value = min(min_value, node.right.val - node.val)

            helper(root.left, min_value)
            helper(root.right, min_value)

            return min_value

        helper(root, min_value)

更改后:

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def minDiffInBST(self, root):
        min_value = float('inf')

        def helper(node, min_value):
            # if root is None
            if not node: 
                return node
            print(node.val, min_value)

            if (node.left):
                min_value = min(min_value, node.val - node.left.val)
            if (node.right):
                min_value = min(min_value, node.right.val - node.val)

            helper(node.left, min_value)
            helper(node.right, min_value)

            return min_value

        helper(root, min_value)

共有1个答案

马清野
2023-03-14

助手函数中,在递归调用中使用,而不是当前的节点。因此,不是迭代整个树,而是连续地为同一个节点调用helper方法,这就是程序陷入无限递归的原因。使用调试器单步执行代码以调查此类问题非常有帮助。

 类似资料:
  • 主要内容:深度优先搜索(简称“深搜”或DFS),广度优先搜索,总结前边介绍了有关图的 4 种存储方式,本节介绍如何对存储的图中的顶点进行遍历。常用的遍历方式有两种: 深度优先搜索和 广度优先搜索。 深度优先搜索(简称“深搜”或DFS) 图 1 无向图 深度优先搜索的过程类似于树的先序遍历,首先从例子中体会深度优先搜索。例如图 1 是一个无向图,采用深度优先算法遍历这个图的过程为: 首先任意找一个未被遍历过的顶点,例如从 V1 开始,由于 V1 率先访问过了,所以

  • 本文向大家介绍深度优先搜索,包括了深度优先搜索的使用技巧和注意事项,需要的朋友参考一下 图遍历是按某种系统顺序访问图的所有顶点的问题。遍历图主要有两种方法。 广度优先搜索 深度优先搜索 深度优先搜索(DFS)算法从顶点v开始,然后遍历到之前未访问过的相邻顶点(例如x),并将其标记为“已访问”,然后继续处理x的相邻顶点,依此类推。 如果在任何一个顶点上遇到所有相邻顶点都被访问过,则它将回溯直到找到具

  • 有没有人看到上述算法存在缺陷?我不是图论方面的专家,但我认为我对递归和迭代有很好的把握,我相信这也是一样的。我想让它在功能上与递归算法等价。它应该维护第一个算法的所有属性,即使不需要这些属性。 当我开始写它的时候,我并不认为我会有三个循环,但结果就是这样。当我环顾谷歌时,我看到了其他的迭代算法,它们只有一个双重嵌套的循环,然而,它们似乎不是从多个来源出发的。(即他们不会发现不连通图的每一个顶点)

  • 3. 深度优先搜索 现在我们用堆栈解决一个有意思的问题,定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的路线

  • 本文向大家介绍什么是深度优先搜索?相关面试题,主要包含被问及什么是深度优先搜索?时的应答技巧和注意事项,需要的朋友参考一下 如算法名称那样,深度优先搜索所遵循的搜索策略是尽可能“深”地搜索树。它的基本思想是:为了求得问题的解,先选择某一种可能情况向前(子结点)探索,在探索过程中,一旦发现原来的选择不符合要求,就回溯至父亲结点重新选择另一结点,继续向前探索,如此反复进行,直至求得最优解。深度优先搜索

  • 深度优先搜索的一般运行时间如下。 dfs 中的循环都在 $$O(V)$$ 中运行,不计入dfsvisit 中发生的情况,因为它们对图中的每个顶点执行一次。 在dfsvisit 中,对当前顶点的邻接表中的每个边执行一次循环。 由于只有当顶点为白色时,dfsvisit 才被递归调用,所以循环对图中的每个边或 $$O(E)$$ 执行最多一次。 因此,深度优先搜索的总时间是 $$O(V + E)$$。