给定一个二叉搜索树的根结点 root, 返回树中任意两节点的差的最小值。
示例:
输入: root = [4,2,6,1,3,null,null]
输出: 1
解释:
注意,root是树结点对象(TreeNode object),而不是数组。
给定的树 [4,2,6,1,3,null,null] 可表示为下图:
最小的差值是 1, 它是节点1和节点2的差值, 也是节点3和节点2的差值。
注意:
二叉树的大小范围在 2 到 100。
二叉树总是有效的,每个节点的值都是整数,且不重复。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-distance-between-bst-nodes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
看到二叉搜索树的题目,马上要想起来一条关键性质:
二叉搜索树的中序遍历是升序数组。
比如对于样例输入 root = [4,2,6,1,3,null,null],中序遍历的结果就是 [1, 2, 3, 4, 6]。
题目要求两个结点的最小距离,就是要求中序遍历数组里相邻两个元素差的最小值。
所以说:
1.中序遍历二叉搜索树得到的是有序结点;
2.定义一个辅助结点temp,用于存放上一个节点,当pre不为空即从第二个节点开始记录二叉搜索树中两个节点差值的最小值即可;
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
TreeNode pre;
int min = Integer.MAX_VALUE;
public int minDiffInBST(TreeNode root) {
inorder(root);
//void类型的返回语句,这个是第三步的返回值
return min;
}
public void inorder(TreeNode node){
//第一步,确定终止条件
if(node == null){
return;
}
//第二步,搞清递归要做什么
inorder(node.left);
if(pre != null){
min = Math.min(min, node.val - pre.val); //中序出来的结果是递增的,所以只需要比较前后两个节点的值即可
}
pre = node;
inorder(node.right);
}
}
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def minDiffInBST(self, root: TreeNode) -> int:
def inorder(node):
if not node:
return
inorder(node.left)
self.res = min(self.res, node.val - self.pre)
self.pre = node.val
inorder(node.right)
self.pre = -9999
self.res = 9999
inorder(root)
return self.res