题目:

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题解的更多相关文章

  1. [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 ...

  2. leetCode :103. Binary Tree Zigzag Level Order Traversal (swift) 二叉树Z字形层次遍历

    // 103. Binary Tree Zigzag Level Order Traversal // https://leetcode.com/problems/binary-tree-zigzag ...

  3. [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 ...

  4. 32-3题:LeetCode103. Binary Tree Zigzag Level Order Traversal锯齿形层次遍历/之字形打印二叉树

    题目 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null,null,15,7], 3 ...

  5. LeetCode103. 二叉树的锯齿形层次遍历

    103. 二叉树的锯齿形层次遍历 描述 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 示例 例如,给定二叉树: [3,9,2 ...

  6. Leetcode103. Binary Tree Zigzag Level Order Traversal二叉树的锯齿形层次遍历

    给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null,null,15,7], 3 / ...

  7. Java实现 LeetCode 103 二叉树的锯齿形层次遍历

    103. 二叉树的锯齿形层次遍历 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null ...

  8. LeetCode 103. 二叉树的锯齿形层次遍历(Binary Tree Zigzag Level Order Traversal)

    103. 二叉树的锯齿形层次遍历 103. Binary Tree Zigzag Level Order Traversal 题目描述 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再 ...

  9. 103 Binary Tree Zigzag Level Order Traversal 二叉树的锯齿形层次遍历

    给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行).例如:给定二叉树 [3,9,20,null,null,15,7],    3   ...

随机推荐

  1. HighCharts画时间趋势图,标示区以及点击事件操作

    最近在用HighCharts画趋势图,如果按照设计文档上来画那太复杂了,于是根据自己多年的经验改动了设计文档,添加了highcharts的标示区,然而我也发现,最后一次画highchart趋势图还是在 ...

  2. spring注解 di 和 ioc 注解

    注解: 1.注解就是为了说明java中的某一个部分的作用(Type) 2.注解都可以用于哪个部门是@Target注解起的作用 3.注解可以标注在ElementType枚举类所指定的位置上 4. @Do ...

  3. iOS10 完美降级 iOS9.3.2,保留全部数据

    本篇文章由:http://xinpure.com/downgrade-ios10-perfect-ios9-3-2-retention-of-all-data/ iOS 10 Beta版尝鲜 前段时间 ...

  4. js中的let和var

    在ES6中,应该尽量使用const和let来声明变量,而尽量避免使用var. var的缺点是它的作用域比较混乱,使用let能够保证清晰的作用域. 下面看一个小例子. var x = 3; if(x== ...

  5. SDUT 2608 Alice and Bob (巧妙的二进制)

    Alice and Bob Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Alice and Bob like playing ...

  6. python练习笔记——用列表推导式生成二维列表

    用列表推导式如何生成如下列表:[[1, 2, 3], [4, 5, 6], [7, 8, 9]] inner_list = [] outer_list = [] for i in range(1,10 ...

  7. AP_费用报表报销基本操作(流程)

    2014-06-04 Created By BaoXinjian

  8. WebADI_WebADI工作日志设定(案例)

    20150707 Created By BaoXinjian

  9. fcntl函数用法详解

    功能描述:根据文件描述词来操作文件的特性. #include <unistd.h> #include <fcntl.h>  int fcntl(int fd, int cmd) ...

  10. Unix环境高级编程(三)标准I/O库

    标准I/O库是ISO C的标准,在很多操作系统上面都实现.Unix文件I/O函数都是针对文件描述符的,当打开一个文件的时候,返回该文件描述符用于后续的I/O操作.而对于标准I/O库,操作则是围绕流进行 ...