博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode103 BinaryTreeZigzagLevelOrderTraversal(二叉树Z形层次遍历) Java题解
阅读量:5131 次
发布时间:2019-06-13

本文共 2782 字,大约阅读时间需要 9 分钟。

题目:

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
> zigzagLevelOrder(TreeNode root) { List
> result=new ArrayList
>();//存放终于结果 boolean isLeftToRight=false;//从左到右的方向 Queue
nodeQueue=new LinkedList<>();//存放节点 便于每一层遍历 //处理根节点 if(root==null) return result; else { List
list=new ArrayList<>(); list.add(root.val); result.add(list); nodeQueue.offer(root); } while(!nodeQueue.isEmpty()) { int size=nodeQueue.size(); List
tempResult=new ArrayList<>();//用来临时存放每一层节点的遍历结果 Stack
stack=new Stack<>();//用来辅助将队列倒序 if(isLeftToRight) { //将队列里面的节点都先出队列进栈再出栈进队列 使得和原来的顺序刚好相反 for(int i=0;i
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
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
> zigzagLevelOrder2(TreeNode root) { List
> result=new ArrayList
>();//存放终于结果 Queue
nodeQueue=new LinkedList<>();//存放节点 int flag=1;//flag为奇数的时候 从左到右 为偶数的时候从右到左。 if(root==null) return result; else { nodeQueue.add(root); } while(!nodeQueue.isEmpty()) { int count=nodeQueue.size(); List
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; }}
看代码的长度就知道我之前的有多复杂了 

转载于:https://www.cnblogs.com/wzjhoutai/p/6708439.html

你可能感兴趣的文章
完美解决 Linux 下 Sublime Text 中文输入
查看>>
【python】理解循环:for,while
查看>>
python定时清空本目录下除本脚本外的全部文件
查看>>
【PHP】在目标字符串指定位置插入字符串
查看>>
【JS】jQuery设置定时器,访问服务器(PHP示例)配合微信、支付宝原生支付,跳转web网页...
查看>>
统计学的统一(1)
查看>>
实验四2
查看>>
用CSS3画出一个立方体---转
查看>>
date
查看>>
C#实现Winform间的数据交互的三种方法
查看>>
java项目中rmi远程调用实例
查看>>
5.分组函数
查看>>
java_Observer Design Pattern
查看>>
【c++编程思想】字符串
查看>>
Python入门神图
查看>>
CentOS 7.0安装
查看>>
在小程序开发的新风口 看华为云如何助立创科技抢占市场红利
查看>>
第一次博客随笔:苏钰冰
查看>>
HIS-DELPHI-读取数据库配置
查看>>
如何引入iconfont图标与Element-UI组件
查看>>