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

时间: 2024-08-29 09:37:46

[Leetcode] Binary Tree Level order travelsal (normal and zigzag and bottom-up )的相关文章

[leetcode]Binary Tree Level Order Traversal @ Python

原题地址:http://oj.leetcode.com/problems/binary-tree-level-order-traversal/ 题意:二叉树的层序遍历的实现. 解题思路:二叉树的层序遍历可以用bfs或者dfs来实现.这里使用的dfs实现,代码比较简洁.实际上,二叉树的先序遍历就是dfs实现.   比如一棵树如下: 1 /  \ 2       3 /    \    /   \ 4     5  6    7    二叉树的先序遍历为{1,2,4,5,3,6,7},可以看到这个遍

[leetcode]Binary Tree Level Order Traversal II @ Python

原题地址:http://oj.leetcode.com/problems/binary-tree-level-order-traversal-ii/ 题意: Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root). For example:Given binary

LeetCode——Binary Tree Level Order Traversal

Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level). For example: Given binary tree {3,9,20,#,#,15,7}, 3 / 9 20 / 15 7 return its level order traversal as: [ [3], [9,20], [15,7] ] 原题链接:

LeetCode——Binary Tree Level Order Traversal II

Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root). For example: Given binary tree {3,9,20,#,#,15,7}, 3 / 9 20 / 15 7 return its bottom-up level order trave

LeetCode: Binary Tree Level Order Traversal II [107]

[题目] Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root). For example: Given binary tree {3,9,20,#,#,15,7}, 3 / 9 20 / 15 7 return its bottom-up level order

[LeetCode]Binary Tree Level Order Traversal II

Binary Tree Level Order Traversal II Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root). For example:Given binary tree {3,9,20,#,#,15,7}, 3 / 9 20 / 15 7 re

LeetCode: Binary Tree Level Order Traversal 解题报告

Binary Tree Level Order Traversal Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level). For example:Given binary tree {3,9,20,#,#,15,7},    3   / \  9  20    /  \   15   7return its leve

leetcode Binary Tree Level Order Traversal I II

Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level). For example:Given binary tree {3,9,20,#,#,15,7}, 3 / 9 20 / 15 7 return its level order traversal as: [ [3], [9,20], [15,7] ] /** *

Leetcode: Binary Tree Level Order Transversal II

Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root). For example: Given binary tree {3,9,20,#,#,15,7}, 3 / 9 20 / 15 7 return its bottom-up level order trave