最大二叉树
给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:
二叉树的根是数组中的最大元素。
左子树是通过数组中最大值左边部分构造出的最大二叉树。
右子树是通过数组中最大值右边部分构造出的最大二叉树。
通过给定的数组构建最大二叉树,并且输出这个树的根节点。
输入:[3,2,1,6,0,5]
输出:返回下面这棵树的根节点:
6
/ \
3 5
\ /
2 0
\
1
这道题主体思路就是递归,我们可以看出,本质操作就是把一个数组不断分割,并把其中部分的最大值分配给相应的节点,这里我们解释一下递归三部曲:
- 递归终止条件?当左子树和右子树的数组都为空时
- 本次递归做什么?取出数组的最大值,并把数组根据最大值分成左右两个数组,然后进行递归赋值
- 返回什么?子树的根节点
每次递归前分析一下这三点,就可以对于递归的框架有大概的了解。
此外,这题还有一个以前不常接触的点,那就是创建二叉树并返回节点:
首先,我们从构建树的构造函数说起,我们需要定义这么一个类:
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)是什么,具有怎样的性质:
根节点的值大于等于其左子树中任意一个节点的值,小于等于其右节点中任意一节点的值,这一规则适用于
二叉查找树中的每一个节点。
有了这样的性质我们就可以思考一下:
- 如果root.val<L,那么整个左子树的所有值都<L,也就是左子树不用遍历了。
- 如果root.val>R,那么整个右子树的所有值都>R,也就是右子树不用遍历了。
- 如果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