0
点赞
收藏
分享

微信扫一扫

【二叉树】2022年3月21日 - 2022年3月27日

49路末班车 2022-03-22 阅读 69

二叉树

700. 二叉搜索树中的搜索

传送门

比较简单,递归和迭代都可以。

class Solution:
    def searchBST(self, root: TreeNode, val: int) -> TreeNode:
        if not root: return None
        if root.val == val: return root

        if root.val < val: return self.searchBST(root.right, val)
        if root.val > val: return self.searchBST(root.left, val)

class Solution:
    def searchBST(self, root: TreeNode, val: int) -> TreeNode:
        if not root: return

        while root:
            if root.val == val: return root
            if root.val < val: root = root.right
            elif root.val > val: root = root.left
        
        return 

98. 验证二叉搜索树

传送门

可能会想使用递归,每次判断该节点的左节点是不是比根节点小,右节点是不是比根节点大,但是这种情况忽略了子节点的右节点可能比子节点大,但是不一定比根节点小。

而二叉搜索树的特性是:使用中序遍历得到的是一个递增序列。

class Solution:
    def isValidBST(self, root: TreeNode) -> bool:
        nums = []
        def traversal(root):
            if not root: return
            traversal(root.left)
            nums.append(root.val)
            traversal(root.right)

        traversal(root)
        for i in range(1, len(nums)):
            if nums[i] <= nums[i-1]: return False
        return True

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

传送门

只要遇到二叉搜索树,首先要想到中序遍历的结果是一个有序数组,然后对有序数组进行判断,会方便很多。但是这种做法不一定是最优的,不过总比写不出来要强。

class Solution:
    def getMinimumDifference(self, root: TreeNode) -> int:
        # 找树中任意两个不同节点的最小值
        if not root: return

        nums = []
        def traversal(root):
            if not root: return
            traversal(root.left)
            nums.append(root.val)
            traversal(root.right)
        
        traversal(root)
        res = float('inf')
        for i in range(1, len(nums)):
            res = min(res, nums[i]-nums[i-1])
        
        return res

501. 二叉搜索树中的众数

传送门

先来一个笨方法,统计每个数的频率,之后再排序。

class Solution:
    def findMode(self, root: TreeNode) -> List[int]:
        if not root: return
        dic = collections.defaultdict(int)

        def traversal(root):
            if not root: return
            traversal(root.left)
            dic[root.val] += 1
            traversal(root.right)
        
        traversal(root)
        dic = sorted(dic.items(), key=lambda x: x[1], reverse=True)

        res = []
        pre = 0
        for i, (k, v) in enumerate(dic):
            if i == 0:
                pre = v
                res.append(k)
            elif pre == v:
                res.append(k)
        return res
举报

相关推荐

0 条评论