LeetCode之二叉树的层序遍历
问题描述#
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
行)。
例如:
给定二叉树 [3,9,20,null,null,15,7],
返回锯齿形层次遍历如下:
[
[3],
[20,9],
[15,7]
]
问题解法#
首先这是二叉树的问题很容易就想到dfs与bfs。但是分析发现队列只能保证顺序输出,当改变顺序即锯齿输出时,需要知道前一个的左右节点。因此如果保证队列输出就需要将进队的顺序进行改变。又因为这是交替进行的。很容易得到本次进队的顺序是先左孩子还是先右孩子(因为这种也是交替的)。代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
if(root==null)
return new ArrayList<List<Integer>>();
TreeNode q=root;
Alist alist=new Alist();
alist.add(root);
List<List<Integer>> list=new ArrayList<List<Integer>>();
while(alist.one!=alist.two) {//两指针都到队尾了,跳出循环
int start=alist.getStart();
List<Integer> list1=new ArrayList<Integer>();
while(!alist.isgetOther()) {//两个指针相碰了,这一层的结束
q=alist.get();
list1.add(q.val);
if(!alist.flag) {//先左后右
if(q.left!=null)
alist.add(q.left);
if(q.right!=null)
alist.add(q.right);
}else {//先右后左
if(q.right!=null)
alist.add(q.right);
if(q.left!=null)
alist.add(q.left);
}
alist.change(); //一个节点处理完毕,改变节点
}
list.add(list1);//将这层的值放入整体的list中
alist.change2(start);//调整队尾队头
}
return list;
}
}
class Alist extends ArrayList{
int one=0;
int two=-1;
boolean flag=false;//用来控制本次是怎么进队
int getStart(){
return flag?two:one;
}
boolean isgetOther() {
return two==one;
}
void change() {
if(flag)
two--;
else
one--;
}
void change2(int index) {
if(flag)
{
one=this.size()-1;two=index;
}
else
{
two=this.size()-1;one=index;
}
flag=!flag;
}
TreeNode get() {
if(flag)
return (TreeNode)this.get(two);
else
return(TreeNode)this.get(one);
}
}
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· dotnet 源代码生成器分析器入门
· 官方的 MCP C# SDK:csharp-sdk
· 一款 .NET 开源、功能强大的远程连接管理工具,支持 RDP、VNC、SSH 等多种主流协议!
· 一步一步教你部署ktransformers,大内存单显卡用上Deepseek-R1
· 一次Java后端服务间歇性响应慢的问题排查记录