day17 代码随想录 | 最大二叉树 合并二叉树 二叉搜索树

654 最大二叉树

给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:

  • 二叉树的根是数组中的最大元素。
  • 左子树是通过数组中最大值左边部分构造出的最大二叉树。
  • 右子树是通过数组中最大值右边部分构造出的最大二叉树。

通过给定的数组构建最大二叉树,并且输出这个树的根节点。

又是来构建二叉树,和前序中序遍历来返回二叉树类似,利用前序遍历遍历,只不过这里的分割

条件有变化而已。

递归三要素

1. 递归参数和返回值 递归参数就是节点和对应的节点列表,返回的是节点

2. 递归中止条件 如果not node return node

3. 单层递归

     确定根节点

     切割左右子树

    递归左子树

    递归右子树


class Solution:
    def constructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]:
        if len(nums) == 1: return TreeNode(val=nums[0])
        root_val = max(nums)
        root = TreeNode(root_val)
        split_index = nums.index(root_val)

        # 划分左右子树
        if split_index > 0:
            left_tree = nums[:split_index]
            root.left = self.constructMaximumBinaryTree(left_tree)
        if split_index < len(nums) - 1:
            right_tree = nums[(split_index+1):]
            root.right = self.constructMaximumBinaryTree(right_tree)
        return root

617 合并二叉树

给你两棵二叉树: root1 和 root2 。

想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。

返回合并后的二叉树。

注意: 合并过程必须从两个树的根节点开始。

同样,这个提的思路也明确,采用前序遍历

对于根节点,如果都存在,相加val,其中一个为None,就返回另一个。因为提示说合并必须从root1或者root2开始,因此你不能新创一个节点

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

        root1.left = self.mergeTrees(root1.left, root2.left)
        root1.right = self.mergeTrees(root1.right, root2.right)

        return root1

700.二叉搜索树中的搜索

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

二叉树搜索数的性质就是 左子树的值都小于根节点,右子树的值都大于根节点

因此,我们可以直接判断

递归很简单

1. 递归参数和返回值 参数是root和val,返回值节点

2. 递归中止条件:如果not 就返回None

3.单层递归

   前序

   如果根节点== val ,直接返回

 如果根节点>val 遍历左子树

  反之 遍历右子树

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

        return result

98.验证二叉搜索树

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

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

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

这里要清楚一个概念,二叉搜索树是每个节点都满足 左子树小于根节点,右子树大于根节点

因此需要用递归。 正是因为这个性质,我们采用中序遍历,得到的值一定是一个不含重复元素的有序数组! 我们仅需要中序遍历,得到数组,判断是否有序就可以了

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

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

    def isValidBST(self, root):
        self.vec = []
        self.tranversal(root)
        for i in range(1, len(self.vec)):
            if self.vec[i] <= self.vec[i-1]:
                return False
        return True

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值