leetcode刷题笔记-二叉树5

最大二叉树

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

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

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

输入:[3,2,1,6,0,5]
输出:返回下面这棵树的根节点:

      6
    /   \
   3     5
    \    / 
     2  0   
       \
        1

这道题主体思路就是递归,我们可以看出,本质操作就是把一个数组不断分割,并把其中部分的最大值分配给相应的节点,这里我们解释一下递归三部曲:

  1. 递归终止条件?当左子树和右子树的数组都为空时
  2. 本次递归做什么?取出数组的最大值,并把数组根据最大值分成左右两个数组,然后进行递归赋值
  3. 返回什么?子树的根节点

每次递归前分析一下这三点,就可以对于递归的框架有大概的了解。

此外,这题还有一个以前不常接触的点,那就是创建二叉树并返回节点:
首先,我们从构建树的构造函数说起,我们需要定义这么一个类:

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

显而易见,我们可以通过root = TreeNode(max_num) 这样的方式来创建一个根节点,这也正是下面解题过程的核心:

class Solution:
    def constructMaximumBinaryTree(self, nums: List[int]) -> TreeNode:
        if len(nums)==0:
            return None
        max_num = max(nums)
        max_index = nums.index(max_num)
        root = TreeNode(max_num)
        root.left = self.constructMaximumBinaryTree(nums[0:max_index])
        root.right = self.constructMaximumBinaryTree(nums[max_index+1:])
        return root

修剪二叉搜索树

给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。

输入: 
    3
   / \
  0   4
   \
    2
   /
  1

  L = 1
  R = 3

输出: 
      3
     / 
   2   
  /
 1

做这道题,我们需要了解一下二叉搜索树(二叉查找树,BST)是什么,具有怎样的性质:

根节点的值大于等于其左子树中任意一个节点的值,小于等于其右节点中任意一节点的值,这一规则适用于
二叉查找树中的每一个节点。

有了这样的性质我们就可以思考一下:

  1. 如果root.val<L,那么整个左子树的所有值都<L,也就是左子树不用遍历了。
  2. 如果root.val>R,那么整个右子树的所有值都>R,也就是右子树不用遍历了。
  3. 如果L<root.val<R,那么仍然需要分别遍历两个子树。

有了这样的分析过程,我们看看代码:

class Solution:
    def trimBST(self, root: TreeNode, L: int, R: int) -> TreeNode:
        def dfs(node):
            if not node:
                return None    #值得注意的是这里不是return 0,因为要求返回一个treenode对象
            if node.val<L:
                node = dfs(node.right)
            elif node.val>R:
                node= dfs(node.left)
            else:
                node.left=dfs(node.left)
                node.right=dfs(node.right)
            return node
               
        return dfs(root)

值得注意的是return的用法,下面这两种return写法表达意思一样:

1.return
2.return None
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值