一天一大 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)
}
- Docker容器学习梳理-Dockerfile构建镜像
- 再谈web开中几种经典的大文件上传组件
- Nginx负载均衡中后端节点服务器健康检查的操作梳理
- Linux系统下CPU使用(load average)梳理
- 基于组件的.NET技术(5)
- Silverlight与WPF中BeginInvoke的差异
- Linux下部署SSH登录时的二次身份验证环境记录(利用Google Authenticator)
- Linux下DNS简单部署(主从域名服务器)
- 本地yum源部署记录
- silverlight4:摄像头占用状态检测以及二种截屏方法
- Flash/Flex学习笔记(16):如何做自定义Loading加载其它swf
- 台胞也能发红包喽!小编手把手教你搞定微信支付!
- 获取可视区域高度赋值给div(解决document.body.clientHeight的返回值为0的问题)
- Docker管理工具-Swarm部署记录
- 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 数组属性和方法
- cannot import name ‘imresize‘ from ‘scipy.misc‘
- 一分钟基础:计算机为什么使用二进制?
- 使用hibernate validate做参数校验
- Leetcode No.4 寻找两个正序数组的中位数
- R语言 RevoScaleR的大规模数据集决策树模型应用案例
- 快速学习-sentinel控制台
- 快速学习-sentinel注解支持
- Java工具集-验证码工具类
- RocketMQ 零基础 集群及控制台部署
- Python连接Mariadb数据库
- Linux查看文件,去掉注释行和空白行
- SSH框架分层功能区分
- JAVA字符串如何像数组一样取字符?
- R语言泰坦尼克号随机森林模型案例数据分析
- 日常工作中的设计:解耦和封装