可视化图解算法:按之字形顺序打印二叉树( Z字形、锯齿形遍历)
1. 题目
描述
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)
数据范围:0≤n≤1500,树上每个节点的val满足 |val| <= 1500
要求:空间复杂度:O(n),时间复杂度:O(n)
例如:
给定的二叉树是{1,2,3,#,#,4,5}
该二叉树之字形层序遍历的结果是
[
[1],
[3,2],
[4,5]
]
示例1
输入:
{1,2,3,#,#,4,5}
返回值:
[[1],[3,2],[4,5]]
说明:
如题面解释,第一层是根节点,从左到右打印结果,第二层从右到左,第三层从左到右。
示例2
输入:
{8,6,10,5,7,9,11}
返回值:
[[8],[10,6],[5,7,9,11]]
示例3
输入:
{1,2,3,4,5}
返回值:
[[1],[3,2],[4,5]]
2. 解题思路
对于二叉树的按之字形( 锯齿形)遍历,可以这样操作:先将二叉树进行层序遍历,对于层序遍历的结果进行处理(第2层、第4次、第6层等偶数层的数据进行翻转)。
因此本题的难点还是实现二叉树的层序遍历。
二叉树的层序遍历具体实现如下:
二叉树的层序遍历可以通过【队列】辅助完成,假如要遍历的二叉树如下图所示:
可以通过以下步骤完成层序遍历:
步骤一:定义一个队列,保存每一层的所有节点;先将根节点放入队列。
定义一个队列,初始化时将二叉树的根节点添加进去,此时队列只有一个数据,即count=1。
步骤二:执行出队列操作:出队列的左右子树再重新入队列。出队列的顺序就是二叉树层序遍历的顺序。
之后将队列中的3出队列,只出一个数据(因为此时的count==1)。之后再将3的左右子树入队列。
这时,队列中就有2个数据了,count2。接下来出队列2个数据(因为count2)。即将5和1出队列,同时将5和1的左右子树入队列。
这时,队列中就有4个数据了,count4。接下来出队列4个数据(因为count4)。即将6、2、0、和8出队列,同时将2的左右子树入队列(其他节点不用,因为节点的左右子树已经为Null)。
这时,队列中就有2个数据了,count2。接下来出队列2个数据(因为count2)。即将7和4出队列,7和4的左右子树都为Null了,就不再入队列。
到此时,队列为空,二叉树的层序遍历完成。将结果集返回。
如果文字描述的不太清楚,你可以参考视频的详细讲解。
- Python版本:https://www.bilibili.com/cheese/play/ep1371669
- Java版本:https://www.bilibili.com/cheese/play/ep1367108
- Golang版本:https://www.bilibili.com/cheese/play/ep1364648
3. 编码实现
核心代码如下:
/**
*
* @param root TreeNode类
* @return int整型二维数组
*/
func zigzagLevelOrder(root *TreeNode) [][]int {
// write code here
res := make([][]int, 0) //返回最终结果变量
level := 1 //二叉树的层
if root == nil {
return res
}
queue := []*TreeNode{root} //定义一个队列,保存每一层的所有节点;先将根节点放入队列
for len(queue) > 0 {
row := make([]int, 0) //保存 当前层(每一层)的节点
count := len(queue) //获取一层中的节点数量,并进行遍历
//如果当前层有节点,将节点数据添加到数组中,左、右子树添加到队列中
for i := 0; i < count; i++ {
node := queue[0] //获取队列的顶部元素
queue = queue[1:] //删除队列的顶部元素
row = append(row, node.Val) //节点值添加到切片中
//若是左右子节点存在,则存入左右节点作为下一个层次
if node.Left != nil {
queue = append(queue, node.Left)
}
if node.Right != nil {
queue = append(queue, node.Right)
}
}
if level%2 == 0 {
reverseSlice(row) //偶数行反转,逆序排列
}
res = append(res, row) //一层结束,将这一层的数据追加到结果变量中
level++
}
return res
}
// reverseStrings 翻转一个字符串切片
func reverseSlice(row []int) {
for i, j := 0, len(row)-1; i < j; i, j = i+1, j-1 {
row[i], row[j] = row[j], row[i]
}
}
具体完整代码你可以参考下面视频的详细讲解。
- Python版本:https://www.bilibili.com/cheese/play/ep1371669
- Java版本:https://www.bilibili.com/cheese/play/ep1367108
- Golang版本:https://www.bilibili.com/cheese/play/ep1364648
4.小结
二叉树的按之字形( Z字形、锯齿形)遍历,可以这样操作:先将二叉树进行层序遍历,对于层序遍历的结果进行处理(第2层、第4次、第6层等偶数层的数据进行翻转)。
《数据结构与算法》深度精讲课程正式上线啦!七大核心算法模块全解析:
链表 二叉树 二分查找、排序 堆、栈、队列 回溯算法 哈希算法 动态规划
无论你是备战笔试面试、提升代码效率,还是突破技术瓶颈,这套课程都将为你构建扎实的算法思维底座。立即加入学习打卡,与千名开发者共同进阶!
- Python编码实现:https://www.bilibili.com/cheese/play/ss897667807
- Java编码实现:https://www.bilibili.com/cheese/play/ss161443488
- Golang编码实现:https://www.bilibili.com/cheese/play/ss63997
对于二叉树的相关算法,我们总结了一套【可视化+图解】方法,依据此方法来解决相关问题,算法变得易于理解,写出来的代码可读性高也不容易出错。具体也可以参考视频详细讲解。
今日佳句:君子生非异也,善假于物也。
可视化图解算法:按之字形顺序打印二叉树( Z字形、锯齿形遍历)的更多相关文章
- 【剑指Offer】59、按之字形顺序打印二叉树
题目描述: 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 解题思路: 这道题仍然是二 ...
- 剑指offer---3、按之字形顺序打印二叉树
剑指offer---3.按之字形顺序打印二叉树 一.总结 一句话总结: |||-begin 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照 ...
- 按之字形顺序打印二叉树 牛客网 剑指Offer
按之字形顺序打印二叉树 牛客网 剑指Offer 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推 ...
- 【剑指Offer】按之字形顺序打印二叉树 解题报告(Python)
[剑指Offer]按之字形顺序打印二叉树 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-intervie ...
- JZ-059-按之字形顺序打印二叉树
按之字形顺序打印二叉树 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 题目链接: 按之字形 ...
- 剑指offer系列34----按之字形顺序打印二叉树
[题目]请实现一个函数按照之字形打印二叉树, * 即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印, * 其他行以此类推. 未优化,不是最优解,博主用的是队列 ...
- 剑指Offer-按之字形顺序打印二叉树
package Tree; import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue; /** * ...
- 剑指Offer 59. 按之字形顺序打印二叉树 (二叉树)
题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 题目地址 https://www.nowco ...
- 剑指Offer-- 之字形顺序打印二叉树
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推 /* struct TreeNode { int val ...
- 剑指offer(59)按之字形顺序打印二叉树
题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 题目分析 这道题还是需要画图分析,不然不好找 ...
随机推荐
- Protobuf生成文件报错
Mac下protobuf生成文件报错问题解决办法,windows下就不会这么麻烦了,如果linux下出现类似报错信息按照下面的解决逻辑依然适用. 1.由--go_out引发的报错 1.报错信息: us ...
- Python介绍以及应用场景
Python介绍以及应用场景 Python简介 Python,作为一种解释型.面向对象的高级编程语言,自1989年圣诞节期间由荷兰计算机科学家Guido van Rossum创造以来,已经取得了举 ...
- jar包启停shell脚本
jar包控制脚本1 #!/bin/bash export JAVA_HOME=/u01/java_home/jdk1.8.0_181 export APP_HOME=/u01/test export ...
- css 各种居中
1. 内部容器居中 flex <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- SpringBoot 2.x 接入非标准SSE格式大模型流式响应实践 🚀
近期DeepSeek等国产大模型热度持续攀升,其关注度甚至超过了OpenAI(被戏称为CloseAI).在SpringBoot3.x环境中,可以使用官方的Spring AI轻松接入,但对于仍在使用JD ...
- 百万架构师第四十四课:Nginx:Nginx 的扩展-OpenRestry|JavaGuide
百万架构师系列文章阅读体验感更佳 原文链接:https://javaguide.net 公众号:不止极客 Nginx 的扩展-OpenRestry 课程目标 Nginx 进程模型简介 Nginx 的高 ...
- 低代码 + DeepSeek:赋能开发者,效率飞跃新高度
活字格接入 DeepSeek 前段时间,小编陆续发布了关于葡萄城旗下产品 Wyn 和 SpreadJS 成功接入DeepSeek的技术文章,分享了两款产品与 DeepSeek 集成后的功能优势和应用场 ...
- sql 周岁计算
select FLOOR(DATEDIFF(DY, substring(身份证字段,7,4), GETDATE()) / 365.25) age from [表名]
- 【练习回顾】DS前三次作业
第一次作业 T2.基本计算器 使用了数组栈--数字栈和符号栈 T5.全排列输出(permutation) 使用了标准写法--字典序算法 void reverse(int left,int right) ...
- composer remove 卸载依赖
remove 命令 remove 命令用于移除一个包及其依赖(在依赖没有被其他包使用的情况下),如果依赖被其他包使用,则无法移除: $ composer remove monolog/monolog ...