一、654.最大二叉树
又是构造二叉树,昨天大家刚刚做完 中序后序确定二叉树,今天做这个 应该会容易一些, 先看视频,好好体会一下 为什么构造二叉树都是 前序遍历题目链接/文章讲解:代码随想录
1. 整体思路
(1)递归终止条件:当传入的数组大小等于1,说明到达叶子节点,停止递归。由于题目中已经定义数组的大小大于等于1,所以不需要对空数组的情况进行处理。
(2)定义一个maxvalue用于更新数组最大值,找到中间结点;同时需要定义一个index用于更新当前数组最大值的下标,只有找到最大值的下标才可以切分数组。由于题目要求数组所有数字均为正整数,所以此处maxvalue初始化为0,最大值下标index也初始化为0。
(3)给定数组来构造二叉树必须使用中序遍历,因为必须先确定中间结点才能进行下一层的树构造。注意:区间均是左闭右开原则。
1)中间节点:遍历数组所有元素,如果有比maxvalue更大的元素,就将该元素的值赋给maxvalue,并且将该元素的下标传递给index。接下来定义新节点,传入maxvalue。
2)左子树:向左遍历递归构造左子树,必须保证左区间的元素个数一定需要大于等于1,所以限制条件index大于0,就可以构建左子树, 从而进行切割新数组。
3)左子树:index<nums.size-1保证分割点的右区间的大小一定是大于等于1的,接下来同样分割左右区间。
(4)将节点返回。
(5)优化:每一步构造新数组比较耗时,可以进行合并优化。
2. 完整代码
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def constructMaximumBin