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 traversal as:
[ [15,7], [9,20], [3] ]
This is a typical level order traversal problem. My thought is to use a queue to traverse the element level by level. At first, put the root element into the queue. Then mark the root element and if it has right node or left node, put them into the queue and pop the root element out. Repeat the same process to all the other nodes in the queue. Every time entering the while loop, we need to get the size of the current queue because the size of current queue is the size of the current level.
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> ret = new ArrayList<List<Integer>>();
List<List<Integer>> retReverse = new ArrayList<List<Integer>>();
if (root == null)
return ret;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);
while(!queue.isEmpty()) {
int size = queue.size();
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
if (node.left != null)
queue.offer(node.left);
if (node.right != null)
queue.offer(node.right);
list.add(node.val);
}
ret.add(list);
}
for (int i = ret.size() - 1; i >= 0; i--)
retReverse.add(ret.get(i));
return retReverse;
}
}
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> ret = new ArrayList<List<Integer>>();
List<List<Integer>> retReverse = new ArrayList<List<Integer>>();
if (root == null)
return ret;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);
while(!queue.isEmpty()) {
int size = queue.size();
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
if (node.left != null)
queue.offer(node.left);
if (node.right != null)
queue.offer(node.right);
list.add(node.val);
}
ret.add(list);
}
for (int i = ret.size() - 1; i >= 0; i--)
retReverse.add(ret.get(i));
return retReverse;
}
}