[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

 

posted @ 2021-04-14 22:36  noob_stu  阅读(78)  评论(0)    收藏  举报