代码随想录算法训练营第20天 | 654.最大二叉树、617.合并二叉树、98验证二叉树、700. 二叉搜索树中的搜索

代码随想录算法训练营第20天 |

654.最大二叉树
https://leetcode.cn/problems/maximum-binary-tree/
654.最大二叉树代码随想录
https://programmercarl.com/0654.最大二叉树.html
617.合并二叉树
https://leetcode.cn/problems/merge-two-binary-trees/description/
617.合并二叉树代码随想录
https://programmercarl.com/0617.合并二叉树.html
98.验证二叉树
https://leetcode.cn/problems/validate-binary-search-tree/description/
98.验证二叉树代码随想录
https://programmercarl.com/0098.验证二叉搜索树.html#算法公开课
700.二叉搜索树中的搜索
https://leetcode.cn/problems/search-in-a-binary-search-tree/description/
700.二叉搜索树中的搜索
https://programmercarl.com/0098.验证二叉搜索树.html#算法公开课

654.最大二叉树

题目

给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:

创建一个根节点,其值为 nums 中的最大值。
递归地在最大值 左边 的 子数组前缀上 构建左子树。
递归地在最大值 右边 的 子数组后缀上 构建右子树。
返回 nums 构建的 最大二叉树 。

题解重点:

  • 递归法:trans函数 返回参数即可

题解代码:

递归法

class Solution:
    def trans(self,nums,left,right):
        if left>=right:
            return None
        max_index = left
        for i in range(left+1,right):
            if nums[i]>nums[max_index]:
                max_index = i
        root = TreeNode(nums[max_index])
        root.left = self.trans(nums,left,max_index)
        root.right = self.trans(nums,max_index+1,right)
        return root
    def constructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]:
        return self.trans(nums,0,len(nums))

617.合并二叉树

题目

给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:

创建一个根节点,其值为 nums 中的最大值。
递归地在最大值 左边 的 子数组前缀上 构建左子树。
递归地在最大值 右边 的 子数组后缀上 构建右子树。
返回 nums 构建的 最大二叉树 。

题解重点

  • 递归法:前中后序都可以 只要遍历两棵树即可
  • 迭代法:队列模拟层序遍历;两个都存在就存进去;不一样的子树,从右边直接挪到左边来;

题解代码

递归法

class Solution:
    def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]:
        if not root1 and not root2:
            return None
        if not root1:
            return root2
        if not root2:
            return root1
        if root1 and root2:
            root = TreeNode(root1.val+root2.val)
            root.left = self.mergeTrees(root1.left,root2.left)
            root.right = self.mergeTrees(root1.right,root2.right)
        return root

迭代法

class Solution:
    def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]:
        if not root1:
            return root2
        if not root2:
            return root1
        que = collections.deque()
        que.append(root1)
        que.append(root2)
        while que:
            node1 = que.popleft()
            node2 = que.popleft()
            if node1.left and node2.left:
                que.append(node1.left)
                que.append(node2.left)
            if node1.right and node2.right:
                que.append(node1.right)
                que.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

700.二叉搜索树

题目

给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。

题解:

  • 按照树的性质运行即可

题解代码:

递归法

class Solution:
    def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
        if not root or root.val==val:
            return root
        if val<root.val:
            return self.searchBST(root.left,val)
        if val>root.val:
            return self.searchBST(root.right,val)

迭代法

class Solution:
    def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
        while root:
            if val<root.val:
                root = root.left
            elif val>root.val:
                root = root.right
            else:
                return root
        return root

98.验证二叉搜索树

题目

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:

节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树

题解

  • 注意有坑!整个左子树上的数字都不能大于右子树。也就是说:左子树的右子树也应该小于根节点;
  • 递归法:建立统一变量;
  • 迭代法:栈+ curr pre节点对比

题解代码:

class Solution:
    def __init__(self):
        self.vec = []

    def trans(self,root):
        if not root:
            return True
        self.trans(root.left)
        self.vec.append(root.val)
        self.trans(root.right)

    def isValidBST(self, root: Optional[TreeNode]) -> bool:
        self.vec = []
        self.trans(root)
        for i in range(1,len(self.vec)):
            if self.vec[i]<=self.vec[i-1]:
                return False
        return True
class Solution:
    def isValidBST(self, root: Optional[TreeNode]) -> bool:
        st = []
        pre = None
        curr = root
        while curr or len(st)>0:
            if curr:
                st.append(curr)
                curr = curr.left
            else:
                curr = st.pop()
                if pre and curr.val<=pre.val:
                    return False
                pre = curr
                curr = curr.right
        return True
posted @ 2024-06-23 12:01  哆啦**  阅读(5)  评论(0编辑  收藏  举报