一天一大 leet(二叉树展开为链表)难度:中等-Day20200802
时间:2022-07-25
本文章向大家介绍一天一大 leet(二叉树展开为链表)难度:中等-Day20200802,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目:
给定一个二叉树,原地将它展开为一个单链表。
例如,给定二叉树
1
/
2 5
/
3 4 6
将其展开为:
1
2
3
4
5
6
抛砖引玉
img
题意
- 将二叉树的所有右节点放到根节点右侧上
- 放置顺序:先右后左即某节点同时存在左右节点时优先将左侧节点追加右侧
- 前序遍历
思路
- 递归展开左侧所有节点依次追加
- 展开的节点本身还包含其自身的子节点,需要重新定义节点的子节点
- left -> null
- right -> 需要追加的下一个右节点
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {void} Do not return anything, modify root in-place instead.
*/
var flatten = function (root) {
// 特殊情况:传入的二叉树为空直接返回
if (!root || root.length === 0) {
return root
}
let list = []
helper(root)
// 遍历所有节点
for (let i = 0; i < list.length - 1; i++) {
let node = list[i],
nextNode = list[i + 1]
node.left = null
node.right = nextNode
}
// 收集节点
function helper(node) {
if (node !== null) {
list.push(node)
helper(node.left)
helper(node.right)
}
}
}
其他解法
- 递归时已经遍历了所有节点
- 那么可以尝试不生成真实的 list,在遍历时就拼接二叉树
- 先 left 后 right
- 从根节点遍历时遇到 left 节点就将其遍历插入到 原根节点 right 之前
- 根节点->leftNode-start-left->leftNode-end-right->rightNode
1
/
2 5
/
3 4 6
----------------------=>
1
2
/
3 4
5
6
----------------------=>
1
2
3
4
5
6
var flatten = function (root) {
// 特殊情况:传入的二叉树为空直接返回
if (!root || root.length === 0) {
return root
}
function helper(node) {
if (node !== null) {
// 当前节点右侧节点
let right = node.right
// 将左节点放置到右节点 清除左节点,
node.right = node.left
node.left = null
// 遍历当前节点原左节点的右节点的根节点,使其余当前节点right节点连接
let rightEnd = node
while (rightEnd.right) {
rightEnd = rightEnd.right
}
rightEnd.right = right
// 右侧拼接的还有分支继续拼接
helper(node.right)
}
}
helper(root)
}
- 效果类似于label从下往上滑(采用uiTableView实现)
- android 热修补之andfix实践
- ios 设置label的高度随着内容的变化而变化
- Android字体大小怎么自适应不同分辨率?
- iOS textfield实现一行的数字限制,超出进行弹框
- android https安全连接
- 第二章 正则表达式位置匹配攻略
- 从网络上下载省份城市名称并存入文件然后进行读取省份城市
- android 应用模式之mvp
- Android网络请求框架之Retrofit实践
- iOS 跳转到应用所在的App Store市场
- 第一章 正则表达式字符匹配攻略
- js最新手机号码、电话号码正则表达式
- iOS afnetworking最新版报错 没有AFHTTPRequestOperationManager类了
- 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 数组属性和方法
- 不可不知的 Java 序列化 | 技术创作101训练营
- 当我们做后仿时我们究竟在仿些什么(四)
- Elasticsearch: Rare Terms Aggregation
- Elasticsearch: 运用 Pinned query 来提高文档的排名 (7.5发行版新功能)
- leetcode树之从翻转二叉树
- DiskDB,一个不用网的数据库
- 何时用多线程?多线程需要加锁吗?线程数多少最合理?
- Spring Cloud @RefreshScope 刷新机制必知道
- “非主流”的纯前端性能优化
- CICD(二) Ansible
- JS Sequence Diagrams
- kubernetes(二十一) 微服务链路监控& 自动发布
- kubernetes(八) kubernetes的使用
- kubernetes(九) kubernetes控制器
- kubernetes(十) kubernetes service,ingress&cm,secret