leetcode day 20 654. 最大二叉树 617. 合并二叉树 700. 二叉搜索树中的搜索 98. 验证二叉搜索树


提示:以下是本篇文章正文内容,下面案例可供参考

一、leetcode 654. 最大二叉树

1.题目链接:

link

2.独立做题问题总结

一开始做的时候用的。

3.解法总结:

		if len(nums) == 0:
            return None
        
        if len(nums) == 1:
            root = TreeNode(nums[0])
            return root
        
        rootval = max(nums)
        rootindex = nums.index(rootval)
        root = TreeNode(rootval)
        numsl = nums[0:rootindex]
        numsr = nums[rootindex + 1:]
        root.left = self.constructMaximumBinaryTree(numsl)
        root.right = self.constructMaximumBinaryTree(numsr)
        return root
		

二、leetcode 617. 合并二叉树

1.题目链接:

link

2.独立做题问题总结

3.解法总结:

  1. 递归
    注意前三个判断条件返回的是原root1或root2,而不是新建一个treenode!
		if root1 == None and root2 != None:
            return root2
        elif root1 != None and root2 == None:
            return root1
        elif root1 == None and root2 == None:
            return None
        else:
            root = TreeNode(root1.val + root2.val)
        root.left = self.mergeTrees(root1.left, root2.left)
        root.right = self.mergeTrees(root1.right, root2.right)
        return root
		
  1. 迭代(代码随想录
class Solution:
    def mergeTrees(self, root1: TreeNode, root2: TreeNode) -> TreeNode:
        if not root1: 
            return root2
        if not root2: 
            return root1

        queue = deque()
        queue.append(root1)
        queue.append(root2)

        while queue: 
            node1 = queue.popleft()
            node2 = queue.popleft()
            # 更新queue
            # 只有两个节点都有左节点时, 再往queue里面放.
            if node1.left and node2.left: 
                queue.append(node1.left)
                queue.append(node2.left)
            # 只有两个节点都有右节点时, 再往queue里面放.
            if node1.right and node2.right: 
                queue.append(node1.right)
                queue.append(node2.right)

            # 更新当前节点. 同时改变当前节点的左右孩子. 
            node1.val += node2.val
            if not node1.left and node2.left: 
                node1.left = node2.left
            if not node1.right and node2.right: 
                node1.right = node2.right

        return root1

三、leetcode 700. 二叉搜索树中的搜索

二叉搜索树利用中序遍历!

1.题目链接:

link

2.独立做题问题总结

3.解法总结:

		if root == None:
            return None
        if val == root.val:
            return root
        if val > root.val:
            root = self.searchBST(root.right,val)
        elif val < root.val:
            root = self.searchBST(root.left, val)
        return root
		
  1. 迭代
class Solution:
    def searchBST(self, root: TreeNode, val: int) -> TreeNode:
        while root is not None:
            if val < root.val: root = root.left
            elif val > root.val: root = root.right
            else: return root
        return None

四、leetcode 98. 验证二叉搜索树§§§

1.题目链接:

link

2.独立做题问题总结

3.解法总结:

利用中序遍历,将元素存入数组,判断是否递增

		 def helper(root, res):
            if root == None:
                return res
            res = helper(root.left, res)
            res.append(root.val)
            res = helper(root.right, res)
            return res
        res = []
        if root == None:
            return True
        res = helper(root, res)
        if len(res) == 1:
            return True
        cur1 = res.pop(0)
        while res:
            cur2 = res.pop(0)
            if cur2 <= cur1:
                return False
            cur1 = cur2
        return True

  1. 递归1
    nonlocal cur_max
		def helper(root, l = -float(inf), r = float(inf)):
            if root == None:
                return True
            if l < root.val < r:
                return helper(root.left, l, root.val) and helper(root.right, root.val, r)
            return False
        return helper(root)
  1. 递归2
		def helper(root):
            nonlocal maxval
            if root == None:
                return True
            l = helper(root.left)
            if root.val > maxval:
                maxval = root.val
            else:
                return False

            r = helper(root.right)
            return l and r
        maxval = -float(inf)
        return helper(root)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值