如何理解二叉树的层次遍历
发表于:2025-01-27 作者:千家信息网编辑
千家信息网最后更新 2025年01月27日,本篇文章给大家分享的是有关如何理解二叉树的层次遍历,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。算法:树的层次遍历是树的基本操作之一,包
千家信息网最后更新 2025年01月27日如何理解二叉树的层次遍历
本篇文章给大家分享的是有关如何理解二叉树的层次遍历,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
算法:
树的层次遍历是树的基本操作之一,包括二叉树的层次遍历,多叉树的层次遍历,以及二叉树层次遍历的变形题目,层次遍历+每一层的节点的翻转等操作。
对于这类题目,典型算法就是先将树按照层次存入数组当中,然后统一对每一层的数据进行数据处理。
题目1:
102. 二叉树的层序遍历
代码实现:
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
/*
方法1:非递归操作
*/
/*
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;
}
res,stack1 := 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
node := stack[i]
if node == nil {
continue
}
res = append(res,node.Val)
stackRes = append(stackRes,node.Left)
stackRes = append(stackRes,node.Right)
}
return
}
*/
/*
解法:队列来操作,
树的层次遍历,从左到右遍历树的每一层存入对应的数组即可
*/
/*
方法2:递归操作
利用二叉树的先序遍历方法,也就是先访问根节点,在访问做左孩子,然后访问右孩子。
*/
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 {
res[level] = 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
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
}
执行结果:
以上就是如何理解二叉树的层次遍历,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。
层次
题目
节点
代码
孩子
结果
处理
就是
方法
数据
数组
更多
知识
算法
篇文章
递归
实用
也就是
典型
基本操作
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
神舟数据库登录语句
计算机三级网络技术电子版
网络安全宣传周西安开幕
软件开发师现状
浙江省网络安全总工程师蔡林
4月网络安全教育心得体会
云服务器s2
网络安全需要考证书吗
数据库只存放视图的
微播网络技术北京有限公司
危害网络安全的络案例
广西红色文化馆软件开发系统
学习软件开发要学多久6
方舟服务器总是崩溃
工业园区数据网络技术服务费
南昌度豪网络技术有限公司
控制对数据库中数据的操作权限
如何开启数据库权限
2003网站服务器安全设置
数据库 破解
我的世界手机版服务器如何发信息
宁波软件开发驻场哪里好
数据库dbns是什么
香港服务器选择什么配置
web服务器安全校验
安卓判断是否存在数据库
网络安全做的好的公司
软件开发技术服务质量要求
管道美化软件开发
西安展海互联网科技金锦新