您的位置:首页 > 其它

Leetcode: Binary Tree Level Order Traversal II 理解分析

2014-04-22 18:55 375 查看
题目大意:给定一个二叉树,输出二叉树从最底层到根节点的层序遍历,即从左到右,一层一层从叶子到根的遍历。

理解:与Binary Tree Level Order Traversal(http://blog.csdn.net/blog_szhao/article/details/23860125)不同的是,本题要求逆序输出遍历的每一层,即由叶子层到根节点层。

实现:

/**
* Definition for binary tree
* public class TreeNode {
*     int val;
*     TreeNode left;
*     TreeNode right;
*     TreeNode(int x) { val = x; }
* }
*/
public class Solution {
private ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
private ArrayList<Integer> arr;// =  new ArrayList<Integer>();
public ArrayList<ArrayList<Integer>> levelOrderBottom(TreeNode root) {
if(root == null) return res;
if(root.left == null && root.right == null) {
arr = new ArrayList<Integer>();
arr.add(root.val);
res.add(arr);
return res;
}
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);
int visit = 1, nextVisit = 0;
while(!queue.isEmpty()) {
TreeNode p = queue.peek();
arr = new ArrayList<Integer>();
while(visit > 0 && p != null) {
arr.add(p.val);
queue.poll();
if(p.left != null) {
nextVisit ++;
queue.offer(p.left);
}
if(p.right != null) {
nextVisit ++;
queue.offer(p.right);
}
if(!queue.isEmpty()) p = queue.peek();
visit --;
}
res.add(0, arr); // 新元素插在首位,逆序
if(nextVisit == 0) break;
visit = nextVisit;
nextVisit = 0;
}
return res;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息