代码随想录 Day 17 | 【第六章 二叉树 part05】654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

一、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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值