按之字形顺序打印二叉树
来源:互联网 发布:婚礼入场音乐知乎 编辑:程序博客网 时间:2024/05/01 20:47
题目
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
解题
层次遍历二叉树很好理解
用队列临时存放其中一层的结点,出队列更新到下一层结点
按之字形顺序打印二叉树需要两个栈。
在打印某一行结点时,把下一层的结点保存到相应的栈里。如果当前打印的是奇数层,则先保存左子结点再保存右子结点到第一个栈里;如果当前打印的是偶数层,则先保存右结点在保存左子结点到第二个栈里。
import java.util.ArrayList;import java.util.*;/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/public class Solution { public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) { ArrayList<Integer> row = new ArrayList<Integer>(); ArrayList<ArrayList<Integer> > result = new ArrayList<ArrayList<Integer> >(); if(pRoot == null) return result; Stack<TreeNode> stack1 = new Stack<TreeNode>(); Stack<TreeNode> stack2 = new Stack<TreeNode>(); boolean flag = true; stack1.push(pRoot); while(!stack1.isEmpty() || !stack2.isEmpty()){ row = new ArrayList<Integer>(); if(flag){ int size = stack1.size(); while((size--) >0){ TreeNode node = stack1.pop(); row.add(node.val); if(node.left!=null) stack2.push(node.left); if(node.right!=null) stack2.push(node.right); } flag = false; }else{ int size = stack2.size(); while((size--) >0){ TreeNode node = stack2.pop(); row.add(node.val); if(node.right!=null) stack1.push(node.right); if(node.left!=null) stack1.push(node.left); } flag = true; } result.add(row); } return result; }}
if else 程序写的很搓
用队列
层次遍历输出的每层元素都是左右的
对于本题我们需要交叉的输出
左右输出
右左输出
所有只需要对于偶数的行在层次遍历的基础上进行逆序就好了
import java.util.ArrayList;import java.util.*;/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/public class Solution { public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) { ArrayList<Integer> row = new ArrayList<Integer>(); ArrayList<ArrayList<Integer> > result = new ArrayList<ArrayList<Integer> >(); if(pRoot == null) return result; boolean flag = true; Queue<TreeNode> queue = new LinkedList<TreeNode>(); queue.offer(pRoot); while(!queue.isEmpty()){ int size = queue.size(); row = new ArrayList<Integer>(); while((size--)>0){ TreeNode node = queue.poll(); row.add(node.val); if(node.left!=null) queue.offer(node.left); if(node.right!=null) queue.offer(node.right); } if(!flag){ reverse(row); } flag = !flag; result.add(row); } return result; } public void reverse(ArrayList<Integer> list){ int i=0; int j=list.size() -1; while(i<j){ swap(list,i,j); i++; j--; } } public void swap(ArrayList<Integer> list,int i,int j){ int a = list.get(i); int b = list.get(j); list.set(i,b); list.set(j,a); }}
0 0
- 按之字形顺序打印二叉树
- 按之字形顺序打印二叉树
- 按之字形顺序打印二叉树
- 按之字形顺序打印二叉树
- 按之字形顺序打印二叉树
- 牛客网 | 按之字形顺序打印二叉树
- 按之字形顺序打印二叉树
- 按之字形顺序打印二叉树
- 55.按之字形顺序打印二叉树
- 按之字形顺序打印二叉树
- 按之字形顺序打印二叉树
- 按之字形顺序打印二叉树
- 按之字形顺序打印二叉树
- 【59】按之字形顺序打印二叉树
- 按之字形顺序打印二叉树
- Q61:按之字形顺序打印二叉树
- 按之字形顺序打印二叉树
- 按之字形顺序打印二叉树
- java基础(八)Math/代码块/继承成员方法指南的关系/继承中成员变量之间的关系/方法的重写/继承中构造方法之间的关系/this和super的区别
- HDU 5119 Happy Matt Friends
- SnackBar源码分析(来自design包)
- 1006
- 皮尔逊系数皮尔逊系数---K近算法之皮尔逊系数
- 按之字形顺序打印二叉树
- Unity性能优化---内存上
- 从苏宁电器到卡巴斯基第07篇:我在佳木斯的日子(下)
- HHTP基础之状态码
- spss四分位数
- Linux spi驱动 (三)
- leetcode-java-238. Product of Array Except Self
- apt-get install 失败
- Unity性能优化---内存下