LeetCode103 BinaryTreeZigzagLevelOrderTraversal(二叉树Z形层次遍历) Java题解
题目:
Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).
For example:
Given binary tree {3,9,20,#,#,15,7}
,
3
/ \
9 20
/ \
15 7
return its zigzag level order traversal as:
[
[3],
[20,9],
[15,7]
]
解题:
这题事实上和二叉树的层序遍历非常类似 不过在这个基础上加上一个左右方向 一開始我的思维被局限住了 写了一个非常冗余的代码版本号 实现思路是这种 当须要从右到左输出的时候 我把队列里面的节点输出然后 反序存回队列
代码:
public static List<List<Integer>> zigzagLevelOrder(TreeNode root) { List<List<Integer>> result=new ArrayList<List<Integer>>();//存放终于结果
boolean isLeftToRight=false;//从左到右的方向
Queue<TreeNode> nodeQueue=new LinkedList<>();//存放节点 便于每一层遍历 //处理根节点
if(root==null)
return result;
else {
List<Integer> list=new ArrayList<>();
list.add(root.val);
result.add(list);
nodeQueue.offer(root);
} while(!nodeQueue.isEmpty())
{
int size=nodeQueue.size();
List<Integer> tempResult=new ArrayList<>();//用来临时存放每一层节点的遍历结果 Stack<TreeNode> stack=new Stack<>();//用来辅助将队列倒序 if(isLeftToRight)
{
//将队列里面的节点都先出队列进栈再出栈进队列 使得和原来的顺序刚好相反
for(int i=0;i<size;i++)
{
stack.push(nodeQueue.poll());
}
while(!stack.isEmpty())
nodeQueue.offer(stack.pop()); while(size>0)//从左到右
{
size--;
TreeNode tempNode=nodeQueue.poll();
if(tempNode.left!=null)
{
nodeQueue.offer(tempNode.left);
tempResult.add(tempNode.left.val);
}
if(tempNode.right!=null)
{
nodeQueue.offer(tempNode.right);
tempResult.add(tempNode.right.val);
}
} if(!tempResult.isEmpty()) result.add(tempResult);
//循环退出 表示一层已经遍历完了 这时候重置方向标志位
isLeftToRight=false; }
else {
//将队列里面的节点都先出队列进栈再出栈进队列 使得和原来的顺序刚好相反
for(int i=0;i<size;i++)
{
stack.push(nodeQueue.poll());
}
while(!stack.isEmpty())
nodeQueue.offer(stack.pop()); while(size>0)//从右到左
{
size--;
TreeNode tempNode=nodeQueue.poll();
if(tempNode.right!=null)
{
nodeQueue.offer(tempNode.right);
tempResult.add(tempNode.right.val);
}
if(tempNode.left!=null)
{
nodeQueue.offer(tempNode.left);
tempResult.add(tempNode.left.val);
}
}
if(!tempResult.isEmpty()) result.add(tempResult);
//循环退出 表示一层已经遍历完了 这时候重置方向标志位
isLeftToRight=true;
}
} return result; }
后面看别人的解答,事实上全然没有必要在队列中反序 仅仅要在存每一层输出结果的ArrayList中反序存入就能够了 以下是这样的思路的代码:
public static List<List<Integer>> zigzagLevelOrder2(TreeNode root) { List<List<Integer>> result=new ArrayList<List<Integer>>();//存放终于结果
Queue<TreeNode> nodeQueue=new LinkedList<>();//存放节点
int flag=1;//flag为奇数的时候 从左到右 为偶数的时候从右到左。 if(root==null)
return result;
else {
nodeQueue.add(root);
} while(!nodeQueue.isEmpty())
{
int count=nodeQueue.size();
List<Integer> tempResult=new ArrayList<>();
while(count>0)
{
TreeNode tempNode=nodeQueue.poll();
count--;
if(flag%2!=0)//从左到右
{
tempResult.add(tempNode.val);
}
else {//
tempResult.add(0,tempNode.val);
} if(tempNode.left!=null)
nodeQueue.add(tempNode.left);
if(tempNode.right!=null)
nodeQueue.add(tempNode.right);
}
if(!tempResult.isEmpty()) result.add(tempResult);
flag++;
} return result; } }
看代码的长度就知道我之前的有多复杂了
LeetCode103 BinaryTreeZigzagLevelOrderTraversal(二叉树Z形层次遍历) Java题解的更多相关文章
- [Leetcode] Binary tree Zigzag level order traversal二叉树Z形层次遍历
Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...
- leetCode :103. Binary Tree Zigzag Level Order Traversal (swift) 二叉树Z字形层次遍历
// 103. Binary Tree Zigzag Level Order Traversal // https://leetcode.com/problems/binary-tree-zigzag ...
- [Swift]LeetCode103. 二叉树的锯齿形层次遍历 | Binary Tree Zigzag Level Order Traversal
Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...
- 32-3题:LeetCode103. Binary Tree Zigzag Level Order Traversal锯齿形层次遍历/之字形打印二叉树
题目 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null,null,15,7], 3 ...
- LeetCode103. 二叉树的锯齿形层次遍历
103. 二叉树的锯齿形层次遍历 描述 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 示例 例如,给定二叉树: [3,9,2 ...
- Leetcode103. Binary Tree Zigzag Level Order Traversal二叉树的锯齿形层次遍历
给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null,null,15,7], 3 / ...
- Java实现 LeetCode 103 二叉树的锯齿形层次遍历
103. 二叉树的锯齿形层次遍历 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null ...
- LeetCode 103. 二叉树的锯齿形层次遍历(Binary Tree Zigzag Level Order Traversal)
103. 二叉树的锯齿形层次遍历 103. Binary Tree Zigzag Level Order Traversal 题目描述 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再 ...
- 103 Binary Tree Zigzag Level Order Traversal 二叉树的锯齿形层次遍历
给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行).例如:给定二叉树 [3,9,20,null,null,15,7], 3 ...
随机推荐
- HighCharts画时间趋势图,标示区以及点击事件操作
最近在用HighCharts画趋势图,如果按照设计文档上来画那太复杂了,于是根据自己多年的经验改动了设计文档,添加了highcharts的标示区,然而我也发现,最后一次画highchart趋势图还是在 ...
- spring注解 di 和 ioc 注解
注解: 1.注解就是为了说明java中的某一个部分的作用(Type) 2.注解都可以用于哪个部门是@Target注解起的作用 3.注解可以标注在ElementType枚举类所指定的位置上 4. @Do ...
- iOS10 完美降级 iOS9.3.2,保留全部数据
本篇文章由:http://xinpure.com/downgrade-ios10-perfect-ios9-3-2-retention-of-all-data/ iOS 10 Beta版尝鲜 前段时间 ...
- js中的let和var
在ES6中,应该尽量使用const和let来声明变量,而尽量避免使用var. var的缺点是它的作用域比较混乱,使用let能够保证清晰的作用域. 下面看一个小例子. var x = 3; if(x== ...
- SDUT 2608 Alice and Bob (巧妙的二进制)
Alice and Bob Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 Alice and Bob like playing ...
- python练习笔记——用列表推导式生成二维列表
用列表推导式如何生成如下列表:[[1, 2, 3], [4, 5, 6], [7, 8, 9]] inner_list = [] outer_list = [] for i in range(1,10 ...
- AP_费用报表报销基本操作(流程)
2014-06-04 Created By BaoXinjian
- WebADI_WebADI工作日志设定(案例)
20150707 Created By BaoXinjian
- fcntl函数用法详解
功能描述:根据文件描述词来操作文件的特性. #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd) ...
- Unix环境高级编程(三)标准I/O库
标准I/O库是ISO C的标准,在很多操作系统上面都实现.Unix文件I/O函数都是针对文件描述符的,当打开一个文件的时候,返回该文件描述符用于后续的I/O操作.而对于标准I/O库,操作则是围绕流进行 ...