[Leetcode] Binary Tree Level order travelsal (normal and zigzag and bottom-up )
一、normal fasion
使用queue记录上次访问的是记录的孩子节点
1 public List<List<Integer>> levelOrder(TreeNode root) { 2 List<List<Integer>> res = new LinkedList<List<Integer>>(); 3 Queue<TreeNode> queue = new LinkedList<TreeNode>(); 4 queue.add(root); 5 while(!queue.isEmpty()){ 6 int size=queue.size(); 7 List<Integer> listone = new LinkedList<Integer>(); 8 for(int i=0;i<size;i++){ 9 TreeNode tmp = queue.poll(); 10 listone.add(tmp.val); 11 if(tmp.left!=null) queue.offer(tmp.left); 12 if(tmp.right!=null) queue.offer(tmp.right); 13 } 14 res.add(listone); 15 } 16 return res; 17 }
二、zigzag fasion
使用两个stack交替的记录孩子信息,并且使用index标示是从左向右遍历,还是从右向左进行遍历,两种方式还会影响孩子节点遍历的顺序
1 public List<List<Integer>> zigzagLevelOrder(TreeNode root) { 2 List<List<Integer>> res = new LinkedList<List<Integer>>(); 3 Stack [] stacks = new Stack[2]; 4 stacks[0]= new Stack(); 5 stacks[1]= new Stack(); 6 int index=0; 7 while(!stacks[index%2].isEmpty()){ 8 Stack<Integer> s1 = stacks[index%2]; 9 Stack<Integer> s2 = stacks[(index+1)%2]; 10 List<Integer> listone =new LinkedList<Integer>(); 11 while(!s1.isEmpty()){ 12 TreeNode tmp =s1.pop(); 13 listone.add(tmp.val); 14 if(index%2==0){ 15 if(s1.left!=null) s2.push(s1.left); 16 if(s1.right!=null) s2.push(s1.right); 17 }else{ 18 if(s1.right!=null) s2.push(s1.right); 19 if(s1.left!=null) s2.push(s1.left); 20 } 21 } 22 res.add(listone); 23 index=(index+1)%2; 24 } 25 return res; 26 }
三、bottom up fasion
这里两种方法实际上都是normal的方法,只不过最后要对list当中的层进行reverse
3.1 几乎和一一样的方法
1 public List<List<Integer>> levelOrderBottom(TreeNode root) { 2 List<List<Integer>> res = new LinkedList<List<Integer>>(); 3 Queue<TreeNode> queue = new LinkedList<TreeNode>(); 4 queue.offer(root); 5 while(!queue.isEmpty()){ 6 List<Integer> listone = new LinkedList<Integer>(); 7 int size= queue.size(); 8 for(int =0;i<size;i++){ 9 TreeNode tmp = queue.poll(); 10 listone.add(tmp.val); 11 if(tmp.left!=null) queue.offer(tmp.left); 12 if(tmp.right!=null) queue.offer(tmp.right); 13 } 14 res.add(listone); 15 } 16 //reverse them 17 for(int i=0;i<res.size()/2;i++){ 18 List<Integer> tmp = res.get(i); 19 res.set(i,res.get(res.size()-1-i)); 20 res.set(res.size()-1-i,tmp); 21 } 22 return res; 23 }
3.2使用递归
1 //using DFS method to store the result of each 2 private void DFS(List<List<Integer>>res, TreeNode root,int level){ 3 if(res.size()<level){ 4 List<Integer> levelone = new LinkedList<Integer>(); 5 res.add(levelone); 6 } 7 List<Integer> levelone = res.get(level-1); 8 levelone.add(root.val); 9 DFS(res,root.left,level+1); 10 DFS(res,root.right,level+1); 11 } 12 public List<List<Integer>> levelOrderBottom(TreeNode root) { 13 List<List<Integer>> res = new LinkedList<List<Integer>>(); 14 DFS(res,root,1); 15 //reverse them 16 for(int i=0;i<res.size()/2;i++){ 17 List<Integer> tmp = res.get(i); 18 res.set(i,res.get(res.size()-1-i)); 19 res.set(res.size()-1-i,tmp); 20 } 21 return res; 22 }
问题:
有没有不用reverse的方法?