力扣783.二叉搜索树节点最小距离
发布日期:2021-05-15 01:04:53 浏览次数:19 分类:精选文章

本文共 1534 字,大约阅读时间需要 5 分钟。

在这里,我们将讨论如何通过深度优先搜索遍历二叉搜索树,并计算相邻节点值之间的最小差值。根据二叉搜索树的性质,左子树的值小于其父节点,右子树的值大于其父节点。因此,进行一次中序遍历可以按从小到大顺序记录所有节点的值,从而找到所有相邻节点之间的最小差值。

  • 深度优先搜索(DFS):由于二叉搜索树的结构,DFS能够按特定顺序访问节点。每次访问一个节点,记录其值,与前一个已访问的节点的值比较,计算差值,并更新最小差值。

  • 递归实现:使用递归函数进行DFS遍历。在函数访问每个节点时,首先处理已访问的前一个节点,计算差值,然后递归访问左子树,接着是右子树。这种方法确保了记录了所有相邻节点的差值。

  • 节点顺序管理:通过使用一个变量记录当前节点是第一次访问还是之后的访问,可以避免在第一次访问时(没有前驱节点时)计算错误差值。

  • 以下是函数的一种实现方式:

    int minDiffInBST(TreeNode root) {    if (root == null) {        return Integer.MAX_VALUE;    }        int minDiff = Integer.MAX_VALUE;        // 使用辅助函数进行递归遍历    traverse(root, -1, minDiff, root.val);        return minDiff != Integer.MAX_VALUE ? minDiff : -1;}// 辅助函数:递归深度优先遍历void traverse(TreeNode node, int prevVal, int& minDiff, int currentVal) {    if (node == null) {        return;    }        // 初始访问(没有prevVal)    if (prevVal == -1) {        prevVal = currentVal; // 记录当前值为prevVal    } else {        // 计算当前节点与前一个节点的差值        int diff = node.val - prevVal;        if (diff < minDiff) {            minDiff = diff;        }        prevVal = node.val; // 更新prevVal为当前节点的值    }        // 递归访问左子树    traverse(node.left, prevVal, minDiff, node.val);    // 递归访问右子树    traverse(node.right, prevVal, minDiff, node.val);}

    步骤解释:

  • 初始化变量:函数minDiffInBST开始时,初始化minDiffInteger.MAX_VALUE表示尚未找到最小值。

  • 调用辅助函数:不管是否为空树,辅助函数都会被调用。辅助函数接受当前节点、上一个节点的值、最小差值以及当前节点的值。

  • 进入新节点:当函数进入新节点时,检查是否是第一次(prevVal == -1)。如果是,记录当前值为prevVal;否则,计算当前节点与prevVal的差值,并更新minDiff

  • 递归访问:递归处理左子树和右子树,再次调用函数,继续比较差值。

  • 返回结果:如果树为空,返回较大的数值,否则返回最小的差值。

  • 这种方法确保了在遍历过程中,所有相邻节点之间的差值都被比较,从而找到最小值。该遍历顺序符合二叉搜索树的性质,能够高效地解决问题。

    上一篇:力扣36.有效的数独
    下一篇:力扣42.接雨水

    发表评论

    最新留言

    留言是一种美德,欢迎回访!
    [***.207.175.100]2025年04月30日 14时56分53秒