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
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] ]从下往上的层次遍历,两种方法,递归或者使用stack,或者直接使用Collections.reverse()方法来把原来的结果翻转,原理和本质是一样的。
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
List<TreeNode> level1 = new ArrayList<TreeNode>();
List<TreeNode> level2;
if(root == null) return result;
level1.add(root);
while(level1.size() != 0) {
level2 = new ArrayList<TreeNode>();
List<Integer> list = new ArrayList<Integer>();
for(TreeNode node : level1) {
list.add(node.val);
if(node.left != null) level2.add(node.left);
if(node.right != null) level2.add(node.right);
}
result.add(list);
level1 = level2;
}
Collections.reverse(result);
return result;
}
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
if(root == null) return result;
List<TreeNode> roots = new ArrayList<TreeNode>();
roots.add(root);
recurse(roots, result);
return result;
}
private void recurse(List<TreeNode> roots, List<List<Integer>> result) {
if(roots.size() == 0) return ; // terminate condition
List<TreeNode> children = new ArrayList<TreeNode>();
List<Integer> list = new ArrayList<Integer>();
for(TreeNode node : roots) {
list.add(node.val);
if(node.left != null) children.add(node.left);
if(node.right != null) children.add(node.right);
}
recurse(children, result);
result.add(list);
}
没有评论:
发表评论