代码随想录算法训练营第二十天 | 654.最大二叉树

91 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情

654.最大二叉树

题目分析

题目给出一个不重复的整数数组,要求创建一个最大二叉树。最大二叉树为:

  1. 二叉树的根是数组中最大的元素
  2. 二叉树的左子树是通过数组中最大元素左边数组构造出的最大二叉树
  3. 二叉树的右子树是通过数组中最大元素右边数组构造出的最大二叉树

例如数组[3,2,1,6,0,5],构造最大二叉树的过程就是,找到数组中最大的元素6为根节点,6左边的元素组成根结点的左子树,6右边的元素组成根结点的右子树。由此往下得到完整的最大二叉树。

image.png

解题

首先来考虑递归的三要素:

  1. 参数和返回值

参数就是题目给出的数组,以及数组的左右边界。返回值是根节点。

  1. 终止条件

终止条件是当传入的左右边界不正确即左边界大于右边界时,证明数组已遍历完成,可以终止递归程序。

if(left > right) return null
  1. 单层循环的逻辑

首先找到数组的最大值和对应的下标,数数的最大值为当前的根节点,确定数组的下标可以确定左右子树的范围。

let maxValue = -1
let maxIndex = -1
for(let i = left;i <= right;i++) {
      if(arr[i] > maxValue) {
          maxValue = arr[i]
          maxIndex = i
       }
} 

接下来构造根结点和左右子树。

let root = new TreeNode(maxValue)
root.left = BuildTree(arr,left,maxIndex - 1)
root.right = BuildTree(arr,maxIndex + 1,right)

根据这些条件就可以很容易地写出程序。

遇到的问题

Missing initializer in const declaration

这是我第一次看到这个报错,因为平时都是用let声明,这次使用const声明,习惯性的声明函数:

const BuildTree(arr,left,right) {}

MDN上是这样说的:

常量指的是在程序正常运行过程中不能被修改的值。它的值不能通过二次赋值来改变,同时也不能被再次声明。在 JavaScript 中,常量在声明时使用const关键字来修饰。常量需要初始化器;也就是说,必须在声明的同时为其赋值

也就是说常量声明必须赋初始值,这个问题的解决也很简单,只需要将普通函数变为箭头函数即可。

Maximum call stack size exceeded

这个报错的解释是——超过最大调用堆栈大小。

js中的堆栈内存又叫作用域,其中堆内存用于存储引用数据类型值(对象存储的是剑指对函数,存储的是代码字符串)。函数执行形成栈内存,函数执行完栈内存自动释放。而超出最大调用堆栈大小的原因就是递归函数的终止条件没有判断好。