一天一大 leet(将有序数组转换为二叉搜索树)难度:简单-Day20200703
时间:2022-07-25
本文章向大家介绍一天一大 leet(将有序数组转换为二叉搜索树)难度:简单-Day20200703,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目:
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例
给定有序数组: [-10,-3,0,5,9],
一个可能的答案是:[0,-3,9,-10,null,5],
它可以表示下面这个高度平衡二叉搜索树:
0
/
-3 9
/ /
-10 5
抛砖引玉
- 左右两个子树高度差不超过 1:那么树的根节点应该在数组的中心位置
- 已经知道根节点,那下一个节点应该也是在剩余范围的中心位置
- 类似二分法,圈定一个范围,每次取范围的中心位置
- 利用递归,完成多个范围同时保留二分结果
- 递归终止条件:圈定的范围缩小为0
即:把数组按二分法拆分区间,再把区间拼接成树
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {number[]} nums
* @return {TreeNode}
*/
var sortedArrayToBST = function (nums) {
if (!nums) {
return null;
}
let node = new TreeNode();
return buildTree(nums, node);
function buildTree(arr, node) {
let len = arr.length
if (len === 0) return null;
let mid = parseInt(len / 2, 10);
node.val = arr[mid];
let left = [];
for (let i = 0; i < mid; i++) {
left.push(arr[i]);
}
if (left.length > 0) {
node.left = new TreeNode();
buildTree(left, node.left);
}
let right = [];
for (let i = mid + 1; i < arr.length; i++) {
right.push(arr[i]);
}
if (right.length) {
node.right = new TreeNode();
buildTree(right, node.right);
}
return node;
}
};
- 既然划分了区域和知道区域的下一个需要的树节点(中点)
- 那可以尝试不形成真实的数组区域,里索引在原数组中标记区域
- 直接利用递归完成区域内每个节点追加到树上的操作
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {number[]} nums
* @return {TreeNode}
*/
var sortedArrayToBST = function(nums) {
return build(nums, 0, nums.length - 1)
function build(nums, left, right) {
if (left > right) return null
let mid = parseInt((left + right) / 2, 10);
let node = new TreeNode(nums[mid])
node.left = build(nums, left, mid - 1)
node.right = build(nums, mid + 1, right);
return node;
}
};
- Carbondata源码系列(二)文件格式详解
- 挖洞经验 | 记一次针对Twitter(Periscope)API 的有趣挖洞经历
- 设计模式学习(二): 观察者模式 (C#)
- Carbondata源码系列(一)文件生成过程
- BoopSuite:基于Python编写的无线安全审计套件
- 设计模式学习(一):多用组合少用继承(C#)
- 在asp.net web api 2 (ioc autofac) 使用 Serilog 记录日志
- hbase源码系列(十三)缓存机制MemStore与Block Cache
- hbase源码系列(十四)Compact和Split
- 设计模式学习(四): 1.简单工厂 (附C#实现)
- 从头编写 asp.net core 2.0 web api 基础框架 (5) EF CRUD
- 从头编写 asp.net core 2.0 web api 基础框架 (4) EF配置
- RavenDb学习(十)附件,存储大对象
- 从头编写 asp.net core 2.0 web api 基础框架 (3)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- VCS与Verdi的联合仿真
- ADC数据接入到AXI-Steam Interface
- Java面试必问:ThreadLocal终极篇 淦!
- BERT文本摘要
- 【NPM库】- 0x01
- 基于分类任务的信号(EEG)处理--代码分步解析
- 文件操作——举例
- flink之udf执行流程分析篇
- VBA调用外部对象02:FileSystemObject——操作文本文件
- 打卡群刷题总结0723——组合
- VBA根据单元格底色统计个数
- 打卡群刷题总结0724——子集
- 打卡群刷题总结0726——删除排序数组中的重复项 II
- VBA调用外部对象02:FileSystemObject——OpenTextFile参数
- 使用HTTP 404-File Not Found的C2