阅读 7253

手撸二叉树之二叉搜索树的最小绝对差

这是我参与8月更文挑战的第 27 天,活动详情查看:8月更文挑战

Hello, 大家好,今天是我参加8月更文的第 27 天,今天给大家带来的关于二叉树相关的算法题是二叉搜索树的最小绝对差,正文如下:

题目

给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。

示例:

输入:

   1
    \
     3
    /
   2

输出:
1

解释:
最小绝对差为 1,其中 2 和 1 的差的绝对值为 1(或者 2 和 3)。

复制代码

解题思路

根据题意,该二叉树是一棵二叉搜索树,所以我们可以用中序遍历的方式来遍历整棵二叉树,得到的将是一个有序的数组,然后再循环遍历该数组,依次遍历数组中的值,来得到最小绝对差;

上面的解法是一种可行方案,另外我们还能用边遍历边找的方式来得出最小绝对差,具体思路如下:

  1. 定义一个全局变量 ans 用于记录最小绝对差,再定义一个全局变量,用于记录二叉树遍历的上一个值;
  2. 如果遇到节点为 null, 则直接返回;
  3. 中序遍历该二叉树,如果 pre = -1,则表示该节点是根节点,并将根节点的值赋值给 pre, 否则,则计算当前节点与先前节点差的绝对值,并与 ans 比较,取最小值赋值给 ans;

代码实现

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    int ans;
    int pre;
    public int getMinimumDifference(TreeNode root) {
        ans = Integer.MAX_VALUE;
        pre = -1;
        inOrder(root);
        return ans;
    }

    public void inOrder(TreeNode node){
        if (node == null) {
            return;
        }
        inOrder(node.left);
        if (pre == -1) {
            pre = node.val;
        } else {
            ans = Math.min(ans, node.val - pre);
            pre = node.val;
        }
        inOrder(node.right);
    }
}
复制代码

最后

复杂度分析:

  • 时间复杂度:O(n),其中 n 为二叉搜索树节点的个数。每个节点在中序遍历中都会被访问一次且只会被访问一次,因此总时间复杂度为 O(n)。

  • 空间复杂度:O(n)。递归函数的空间复杂度取决于递归的栈深度,而栈深度在二叉搜索树为一条链的情况下会达到 O(n) 级别。

文章分类
前端
文章标签