算法篇:树之树的层次遍历
算法:
树的层次遍历是树的基本操作之一,包括二叉树的层次遍历,多叉树的层次遍历,以及二叉树层次遍历的变形题目,层次遍历+每一层的节点的翻转等操作。
对于这类题目,典型算法就是先将树按照层次存入数组当中,然后统一对每一层的数据进行数据处理。
题目1:
102. 二叉树的层序遍历
https://leetcode-cn.com/problems/binary-tree-level-order-traversal/
代码实现:
/**
Definition for a binary tree node.
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
*/
非递归操作 :
*/
/*
func levelOrder(root *TreeNode) [][]int {
if root == nil {
return nil
}
var stack []*TreeNode
var result [][]int
stack = append(stack,root)
for {
if len(stack) == 0 {
break;
}
= helper(stack) :
if len(res) != 0 {
result = append(result,res)
}
stack = stack1
}
return result
}
func helper(stack []*TreeNode)(res []int, stackRes []*TreeNode){
if len(stack) == 0{
return
}
for i:=0;i<len(stack); i++{
node := stack[i]
if node == nil {
continue
}
res = append(res,node.Val)
stackRes = append(stackRes,node.Left)
stackRes = append(stackRes,node.Right)
}
return
}
*/
/*
解法:队列来操作,
树的层次遍历,从左到右遍历树的每一层存入对应的数组即可
*/
/*
递归操作 :
利用二叉树的先序遍历方法,也就是先访问根节点,在访问做左孩子,然后访问右孩子。
*/
func levelOrder(root *TreeNode) [][]int {
return preOrder(root, 0, [][]int{})
}
func preOrder(root *TreeNode, level int, res [][]int) [][]int {
if root == nil {
return res
}
1.根节点的处理
这里因为level从0开始计算的缘故,len放进去值之后就是1,所以==的时候,便是是新的一层开始
if level == len(res) {
res = append(res,[]int{root.Val})
else {
append(res[level],root.Val) =
}
2.左孩子节点的处理
res = preOrder(root.Left,level+1,res)
3.右孩子节点的处理
res = preOrder(root.Right,level+1,res)
return res
}
执行结果:
题目2:
https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/
代码实现:
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func levelOrderBottom(root *TreeNode) [][]int {
r := [][]int{}
order(root,0,&r)
for i,j:= 0, len(r)-1;i<j;{
r[i],r[j] = r[j],r[i]
i++
j--
}
return r
}
func order(root *TreeNode,level int,res *[][]int) {
if root == nil {
return
}
if len(*res)-1 < level {
*res = append(*res,[]int{root.Val})
} else {
(*res)[level] = append((*res)[level],root.Val)
}
order(root.Left,level+1,res)
order(root.Right,level+1,res)
return
}
执行结果:
题目3:
https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal/
代码实现:
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func zigzagLevelOrder(root *TreeNode) [][]int {
if root == nil {
return nil
}
res := [][]int{}
levelOrder(root,0, &res)
for i:=0; i< len(res); i++ {
if i%2 == 1{
j,k:=0,len(res[i])-1
for j < k{
res[i][j],res[i][k] = res[i][k],res[i][j]
j++
k--
}
}
}
return res
}
func levelOrder(root *TreeNode, l int, res *[][]int) {
if root == nil {
return
}
if len(*res)-1 < l {
*res = append(*res,[]int{root.Val})
} else {
(*res)[l] = append((*res)[l],root.Val)
}
levelOrder(root.Left,l+1,res)
levelOrder(root.Right,l+1,res)
return
}
// 需要: 先按照层次去遍历存储,然后统一的做整理,调整需要转换的对应层次
结果输出:
题目4.
https://leetcode-cn.com/problems/n-ary-tree-level-order-traversal/
代码实现:
/**
* Definition for a Node.
* type Node struct {
* Val int
* Children []*Node
* }
*/
func levelOrder(root *Node) [][]int {
if root == nil {
return nil
}
res := [][]int{}
levelOrderOk(root,0,&res)
return res
}
func levelOrderOk(root *Node,l int, res *[][]int){
if len(*res)-1 < l {
*res = append(*res,[]int{root.Val})
} else {
(*res)[l] = append((*res)[l],root.Val)
}
for _,t := range root.Children {
levelOrderOk(t,l+1,res)
}
return
}
执行结果:
本文分享自微信公众号 - 灰子学技术(huizixueguoxue)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
从Linus Torvalds一封发飙的电邮开始谈设备树究竟是棵什么树?
关注、星标 嵌入式客栈 ,精彩及时送达 [导读] 新版的U-Boot以及内核都引入了设备树,那么这究竟是棵什么样的树呢? 长啥样? 有啥用? 为啥弄个这样的树? 本文基于对设备树标准的理解,来学习整理一下相关的要点,供大家参考。 Linux为啥要设备树? 在Linux3.x之前的内核源码中,存在大量对板级细节信息描述的代码。这些代码充斥在/arch/arm/plat-xxx和/arch/arm/mach-xxx目录,而且更严重的问题是,由于ARM商业生态模式,基于ARM IP授权模式,产生越来越多ARM核芯片。如此一来这类辣鸡代码越来越多,维护变得愈加困难。于是在2011年3月17这天,Linux之父Linus Torvalds飙了,邮件中骂到:“this whole ARM thing is a f*cking pain in the ass”。 自此之后,Linux内核引入了设备树机制以描述计算机板机底层硬件信息。 啥是设备树? 设备树(device tree)是一种描述特定计算机的硬件组件的数据结构,以便操作系统的内核或者引导程序可以使用和管理那些组件,包括一个或多个CPU,内存...
- 下一篇
一步一步开发一个Dubbo框架的小Demo并用Java和Python调用Dubbo接口
“这是一个基于spring+dubbo开发的小demo。主要用于学习基于spring+dubbo框架的开发流程。用将此项目作为学习使用python进行dubbo接口测试的服务端程序。” 构建测试知识体系,欢迎关注 1. 创建Dubbo项目 1.1 使用Maven创建多模块项目 因为这是一个demo项目,我希望将dubbo provider和comsumer都放到一个工程中方便管理。所以我这里创建了一个Maven多模块工程。操作步骤如下: 打开IntelliJ IDEA——> File——>New——>Project——> Maven——> 不要勾选Create from archetype——>Next——> 输入groupId(chunming.liu)和artifactId(dubbo-demo)——>Next——> 设置项目名称dubbodemo——>Finished 这样我们就创建好了一个普通项目,因为该项目是作为一个Parent project存在的,可以直接删除src文件夹。 1.2 创建dubbo-api子项目 ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Hadoop3单机部署,实现最简伪集群
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker安装Oracle12C,快速搭建Oracle学习环境