[LeetCode每日一题]783.二叉搜索树结点最小距离
给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。
示例 1:

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

输入:root = [1,0,48,null,null,12,49]
输出:1
1.解题思路
方法一:遍历所有结点并保存到一个list中,然后升序排序,再求相邻两个数的差看哪个最小
class Solution: def minDiffInBST(self, root: TreeNode) -> int: def pre_order_traversal(l, r): if r: l.append(r.val) pre_order_traversal(l, r.left) pre_order_traversal(l, r.right) nums = [] pre_order_traversal(nums, root) nums.sort() return min([nums[k+1] - nums[k] for k in range(len(nums) - 1)])
方法二:结合二叉搜索树的性质解题。
具有一下性质的二叉树是一颗二叉搜索树:若左子树不为空,则左子树上任何结点的值都小于其根结点的值;若右子树不为空,则右子树上任何结点的值都大于其根结点的值;其左子树、右子树也是二叉搜索树。
显而易见的是,如果使用中序遍历就是一个升序的遍历,也就不需要用一个list来存所有的结点的值了。
递归代码如下。
class Solution: def minDiffInBST(self, root: TreeNode) -> int: def _in_order_traversal(r): if r: _in_order_traversal(r.left) if self.prev: self.min_diff = min(r.val - self.prev.val, self.min_diff) self.prev = r _in_order_traversal(r.right) self.prev = None self.min_diff = 1e5 _in_order_traversal(root) return self.min_diff
非递归代码如下。
class Solution: def minDiffInBST(self, root: TreeNode) -> int: min_diff = 1e5 pre = None stack = [] while root or stack: while root: stack.append(root) root = root.left if stack: temp = stack.pop(-1) if pre: min_diff = min(temp.val - pre.val, min_diff) pre = temp root = temp.right return min_diff
浙公网安备 33010602011771号