Day20 | 二叉树

57 阅读1分钟

654. 最大二叉树

递归构造

每次选取最大值

def constructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]:
    
    def cut(arr):
        if not arr:
            return
        rootnode = max(arr)
        ind = arr.index(rootnode)

        root = TreeNode(rootnode)

        left = arr[:ind]
        right = arr[ind+1:]

        root.left = cut(left)
        root.right = cut(right)

        return root
    
    return cut(nums)

617. 合并二叉树

def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]:
    if not root1:
        return root2
    if not root2:
        return root1

    # root = TreeNode(root1.val+root2.val)

    def combine(root1, root2):
        if not root1:
            return root2
        if not root2:
            return root1
        
        node = TreeNode(root1.val+root2.val)
        
        node.left = combine(root1.left, root2.left)
        node.right = combine(root1.right, root2.right)

        return node
    
    root = combine(root1, root2)
    
    return root

700. 二叉搜索树中的搜索

    def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:

        def search(root):
            if not root:
                return
            
            if root.val == val:
                return root
            
            node_l = search(root.left)
            if node_l:
                return node_l
            
            node_r = search(root.right)
            if node_r:
                return node_r
        
        node = search(root)

        return node

利用二叉搜索树的性质

def searchBST(self, root, val):
        """
        :type root: TreeNode
        :type val: int
        :rtype: TreeNode
        """
        # children = TreeNode()

        # def search(root):
        #     if not root:
        #         return root
            
        #     print(root.val)
        #     if root.val == val:
        #         children = TreeNode(root.val)
        #         return children
            
        #     search(root.left)
        #     search(root.right)

        # children = search(root)

        # return children

        # 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
        # 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
        # 它的左、右子树也分别为二叉搜索树

        if not root or root.val == val: 
            return root

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

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

98. 验证二叉搜索树

中序遍历【左中右】判断是否有序

def isValidBST(self, root: Optional[TreeNode]) -> bool:

    ino = []
    root_v = root.val
    
    def inorder(root):
        if not root:
            return
        
        inorder(root.left)
        ino.append(root.val)
        inorder(root.right)
    
    inorder(root)

    for i in range(1,len(ino)):
        if ino[i] - ino[i-1] <= 0:
            return False
    
    return True