LeetCode/530. 二叉搜索树的最小绝对差

530. 二叉搜索树的最小绝对差

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

示例:

输入:

   1
    \
     3
    /
   2

输出:
1

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

提示:

来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解:

本题可以利用二叉搜索树的特性,对二叉搜索树进行中序遍历后序列是一个递增序列,所以很直观的想到对树进行中序遍历,然后逆向遍历找到最小的绝对值之差。

具体代码如下:

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
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
List<Integer> result = new ArrayList<>();

public int getMinimumDifference(TreeNode root) {
inOrder(root, result);
int minValue = Integer.MAX_VALUE;
for (int i = result.size() - 1; i > 0; i--) {
int temp = Math.abs(result.get(i) - result.get(i - 1));
if (minValue > temp) {
minValue = temp;
}
}
return minValue;
}

void inOrder(TreeNode node, List<Integer> list) {
if (node == null)
return;
inOrder(node.left, list);
list.add(node.val);
inOrder(node.right, list);
}
}

很显然,这样效率很差,因为要先中遍历,然后再对二叉树进行逆向遍历。进一步可以想到,在中序遍历的过程中直接搜索最小绝对值。具体做法就是创建一个preNode用来存放中序遍历中当前节点的上一个节点,因为中序遍历的特性,直接将minValuenode.val - preNode.val作比较,将较小值赋值给minValue

具体代码如下:

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
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
int minValue = Integer.MAX_VALUE;
TreeNode preNode = new TreeNode(Integer.MAX_VALUE);

public int getMinimumDifference(TreeNode root) {

inOrder(root);
return minValue;
}

void inOrder(TreeNode node) {
if (node == null)
return;

inOrder(node.left);
int temp = Math.abs(node.val - preNode.val);
if (minValue > temp)
minValue = temp;
preNode = node;
inOrder(node.right);
}
}

Comments