F_G

许多问题需要说清楚就可以&&走永远比跑来的重要

导航

[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的方法?

posted on 2015-08-15 16:18  F_G  阅读(515)  评论(0编辑  收藏  举报