【算法专栏】从上到下打印二叉树
时间:2022-06-21
本文章向大家介绍【算法专栏】从上到下打印二叉树,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本系列是《剑指offer》或leetcode的JavaScript版本。 每期1-2个算法,也有可能是一个类别。 文章包括题目、思路以及代码。
题目1-不分行从上到下打印
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
思路
- 在打印第一行时,将左孩子节点和右孩子节点存入一个队列里
- 队列元素出队列打印,同时分别将左孩子节点和右孩子节点存入队列
- 这样打印二叉树的顺序就是没行从左到右打印
代码
function PrintFromTopToBottom(root) { const result = []; const queue = []; if (root) { queue.push(root); while (queue.length > 0) { const current = queue.shift(); if (current.left) { queue.push(current.left); } if (current.right) { queue.push(current.right); } result.push(current.val); } } return result; }
题目2-按之字形顺序打印二叉树
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
思路
奇数从左到右,偶数从右到左
和上面的题目类似,同样可以借助在打印一层的时候填充下一层的方法
- 若当前层为奇数层,从左到右打印,同时填充下一层,从右到左打印(先填充左孩子节点再填充右孩子节点)。
- 若当前层为偶数层,从右到左打印,同时填充下一层,从左到右打印(先填充右孩子节点再填充左孩子节点)。
- 不难发现,我们可以使用栈来作为存储结构。
- 分别设定一个奇数栈和一个偶数栈, 从将二叉树头部元素存入奇数栈开始。
代码
function Print(root) { const result = []; const oddStack = []; const evenStack = []; let temp = []; if (root) { oddStack.push(root); while (oddStack.length > 0 || evenStack.length > 0) {
while (oddStack.length > 0) { const current = oddStack.pop(); temp.push(current.val); if (current.left) { evenStack.push(current.left); } if (current.right) { evenStack.push(current.right); } } if (temp.length > 0) { result.push(temp); temp = []; }
while (evenStack.length > 0) { const current = evenStack.pop(); temp.push(current.val); if (current.right) { oddStack.push(current.right); } if (current.left) { oddStack.push(current.left); } } if (temp.length > 0) { result.push(temp); temp = []; }
} } return result; }
考察点
- 二叉树
- 栈
- 队列
- windows service编程
- Entity Framework——常见报错总结
- MySQL 主从复制的原理和配置
- Entity Framework——读写分离
- 如何在 MySQL 中判断中文字符?
- Entity Framework——执行sql语句
- 深入浅析PHP7.0新特征(五大新特征)
- 走在专家的路上,每天优化一条SQL
- 用GenePred注释文件进行数据分析
- 走在专家的路上,每天一条SQL优化(2)
- Entity Framework——性能测试
- 谷歌开放的TensorFlow Object Detection API 效果如何?对业界有什么影响?
- 生信编程直播课程优秀学员作业展示1
- ID转换大全
- 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 数组属性和方法
- 30个编程小技巧,提高代码性能
- httprunner学习27-参数关联时在 yaml 文件 int 和 str 数据类型转换
- python笔记47-面试题:如何判断字典a在字典b
- Go操作腾讯云COS对象存储的简单使用案例
- Go channel 实现原理分析
- Web压测工具之Webbench和http_load
- 这 6 个 Spring Boot 项目够经典
- 自动化测试框架
- Go 并发控制
- Rsync服务简介部署使用及原理详解
- Go之context包的分析
- Repulsion Loss 遮挡场景下的目标检测
- Selenium4 IDE新特性:弹性测试、循环和逻辑判断
- Go 字符串处理
- Golang 特殊类型