Day20 | 654.最大二叉树 、 617.合并二叉树 、 700.二叉搜索树中的搜索 98.验证二叉搜索树

654.最大二叉树

又是构造二叉树,昨天大家刚刚做完 中序后序确定二叉树,今天做这个 应该会容易一些, 先看视频,好好体会一下 为什么构造二叉树都是 前序遍历

题目链接/文章讲解:https://programmercarl.com/0654.最大二叉树.html
视频讲解:https://www.bilibili.com/video/BV1MG411G7ox

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def constructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]:
        if len(nums) == 0:
            return None
        max_num = max(nums)
        max_index = nums.index(max_num)
        left_nums = nums[0:max_index]
        right_nums = nums[max_index+1:]
        
        root = TreeNode(nums[max_index])
        root.left = self.constructMaximumBinaryTree(left_nums)
        root.right = self.constructMaximumBinaryTree(right_nums)
        return root

617.合并二叉树

这次是一起操作两个二叉树了, 估计大家也没一起操作过两个二叉树,也不知道该如何一起操作,可以看视频先理解一下。 优先掌握递归。

题目链接/文章讲解:https://programmercarl.com/0617.合并二叉树.html
视频讲解:https://www.bilibili.com/video/BV1m14y1Y7JK

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]:
        if root1 is None and root2:
            val = root2.val
            root = TreeNode(val)
            root.left = self.mergeTrees(None,root2.left)
            root.right = self.mergeTrees(None,root2.right)
        elif root2 is None and root1:
            val = root1.val
            root = TreeNode(val)
            root.left = self.mergeTrees(root1.left,None)
            root.right = self.mergeTrees(root1.right,None)
        elif root1 and root2:
            val = root1.val+root2.val
            root = TreeNode(val)
            root.left = self.mergeTrees(root1.left,root2.left)
            root.right = self.mergeTrees(root1.right,root2.right)
        else:
            return None
        return root

上面的代码太冗余了,如果一个数的节点的为空时,直接返回另外一个数的对应节点就好了,不需要再重复地去递归构建了。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]:
        if root1 is None and root2:
            return root2
        elif root2 is None and root1:
            return root1
        elif root1 and root2:
            val = root1.val+root2.val
            root = TreeNode(val)
            root.left = self.mergeTrees(root1.left,root2.left)
            root.right = self.mergeTrees(root1.right,root2.right)
            return root
        else:
            return None

700.二叉搜索树中的搜索

递归和迭代 都可以掌握以下,因为本题比较简单, 了解一下 二叉搜索树的特性

题目链接/文章讲解: https://programmercarl.com/0700.二叉搜索树中的搜索.html
视频讲解:https://www.bilibili.com/video/BV1wG411g7sF

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
        while root:
            if root.val == val:
                return root
            elif root.val < val:
                root = root.right
            else:
                root = root.left
        return None

98.验证二叉搜索树

遇到 搜索树,一定想着中序遍历,这样才能利用上特性。

但本题是有陷阱的,可以自己先做一做,然后在看题解,看看自己是不是掉陷阱里了。这样理解的更深刻。

题目链接/文章讲解:https://programmercarl.com/0098.验证二叉搜索树.html
视频讲解:https://www.bilibili.com/video/BV18P411n7Q4

思考

1.中序遍历判断是否是递增的。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
def traversal(root,path):
    if root is None:
        return
    traversal(root.left,path)
    path.append(root.val)
    traversal(root.right,path)
class Solution:
    def isValidBST(self, root: Optional[TreeNode]) -> bool:
        path = []
        traversal(root,path)
        print(path)
        for i in range(1,len(path)):
            if path[i] <= path[i-1]:
                return False
        return True

2.递归法

class Solution:
    def __init__(self):
        self.maxVal = float('-inf')  # 因为后台测试数据中有int最小值

    def isValidBST(self, root):
        if root is None:
            return True

        left = self.isValidBST(root.left)
        # 中序遍历,验证遍历的元素是不是从小到大
        if self.maxVal < root.val:
            self.maxVal = root.val
        else:
            return False
        right = self.isValidBST(root.right)

        return left and right
posted @ 2024-06-15 01:17  forrestr  阅读(23)  评论(0)    收藏  举报