LeetCode 題解之 783. Minimum Distance Between BST Nodes
阿新 • • 發佈:2019-01-31
783. Minimum Distance Between BST Nodes
題目描述和難度
- 題目描述:
給定一個二叉搜尋樹的根結點 root
, 返回樹中任意兩節點的差的最小值。
示例:
輸入: root = [4,2,6,1,3,null,null] 輸出: 1 解釋: 注意,root是樹結點物件(TreeNode object),而不是陣列。 給定的樹 [4,2,6,1,3,null,null] 可表示為下圖: 4 / \ 2 6 / \ 1 3 最小的差值是 1, 它是節點1和節點2的差值, 也是節點3和節點2的差值。
注意:
- 二叉樹的大小範圍在
2
到100
。 - 二叉樹總是有效的,每個節點的值都是整數,且不重複。
思路分析
求解關鍵:最容易想到的就是得到中序遍歷陣列,然後得到最小距離。不過我們也可以在中序遍歷的時候,就進行比較得到最小距離,這樣空間複雜度就可以降至常數級別。
參考解答
參考解答1
import java.util.ArrayList;
import java.util.List;
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
public class Solution {
// 我起初的思路是使用中續遍歷,返回最小值
public int minDiffInBST(TreeNode root) {
List<Integer> inOrderList = new ArrayList<>();
inOrder(root, inOrderList);
int len = inOrderList.size();
int ret = Integer.MAX_VALUE;
for (int i = 0; i < len - 1; i++) {
ret = Math.min(ret, inOrderList.get(i + 1) - inOrderList.get(i));
}
return ret;
}
private void inOrder(TreeNode node, List<Integer> inOrderList) {
if (node == null) {
return;
}
inOrder(node.left, inOrderList);
inOrderList.add(node.val);
inOrder(node.right, inOrderList);
}
}
參考解答2
public class Solution2 {
public int minDiffInBST(TreeNode root) {
// 設定為 Integer 是為了檢測出沒有賦值的情況
Integer[] preVal = new Integer[1];
int[] ret = new int[]{Integer.MAX_VALUE};
inOrder(root,preVal,ret);
return ret[0];
}
private void inOrder(TreeNode node, Integer[] preVal, int[] ret) {
if (node == null) {
return;
}
inOrder(node.left, preVal, ret);
if (preVal[0] != null) {
int diff = node.val - preVal[0];
ret[0] = Math.min(ret[0], diff);
}
// 注意,在這個位置更新之前的值
preVal[0] = node.val;
inOrder(node.right, preVal, ret);
}
}