Leetcode-783-二叉搜索树节点最小距离

Leetcode-783-二叉搜索树节点最小距离

题目描述

  • 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值

mark

1
2
输入:root = [4,2,6,1,3]
输出:1

mark

1
2
输入:root = [1,0,48,null,null,12,49]
输出:1

提示:

  • 树中节点数目在范围 [2, 100]
  • 0 <= Node.val <= 105
  • 差值是一个正数,其数值等于两值之差的绝对值

算法思路:中序遍历

  • 一看到二叉搜索树:中序遍历就对了(转为升序数组)
  • 考虑对升序数组 a 求任意两个元素之差的最小值,答案一定为相邻两个元素之差的最小值,即其他任意间隔距离大于等于 2 的下标对 (i,j) 的元素之差一定大于下标对 (i,i+1) 的元素之差,故不需要再被考虑。
  • 回到本题,本题要求二叉搜索树任意两节点差的最小值,而我们知道二叉搜索树有个性质为二叉搜索树中序遍历得到的值序列是递增有序的,因此我们只要得到中序遍历后的值序列即能用上文提及的方法来解决。
  • 朴素的方法是经过一次中序遍历将值保存在一个数组中再进行遍历求解
    • 我们也可以在中序遍历的过程中用 pre 变量保存前驱节点的值,这样即能边遍历边更新答案
    • 不再需要显式创建数组来保存,需要注意的是 pre 的初始值需要设置成任意负数标记开头,下文代码中设置为 −1。
    • 二叉树的中序遍历有多种方式,包括递归、栈、Morris 遍历等,读者可选择自己最擅长的来实现。下文代码提供最普遍的递归方法来实现
    • 其他遍历方法的介绍可以详细看「94. 二叉树的中序遍历的官方题解」,这里不再赘述。

mark

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
int ans;
int pre;

public int minDiffInBST(TreeNode root) {
ans = Integer.MAX_VALUE;
pre = -1; //pre 用于保存前一个root.val
dfs(root);
return ans;
}

public void dfs(TreeNode root){
// 1. 递归结束的条件
if(root == null){
return;
}

// 2. 中序遍历
dfs(root.left);
// 处理逻辑
if(pre == -1){
pre = root.val;
}else{
ans = Math.min(ans,root.val - pre);
pre = root.val; // pre更新为当前节点的值
}
dfs(root.right);
}
}

复杂度分析:

  • 时间复杂度:O(N),因为每个节点只访问了一次;
  • 空间复杂度:O(N),因为递归用了系统栈。
打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2019-2022 Zhuuu
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信