【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 traversal as:

[
  [15,7],
  [9,20],
  [3]
]

题解:

类似http://www.cnblogs.com/sunshineatnoon/p/3826613.html,无非这次是要从最后一层开始。只要在把每一层的节点加入到最终的list的时候用插入到list头的方法就可以了。不过这里学习到一种更简便的层次遍历的方法,不用记录每一层的起始节点,而是在遍历上一层的时候就记录这一层的节点个数,即统计上一层节点的孩子的总个数,这要比在遍历上一层时找到这一层的起始节点容易的多。

代码如下:

 1 /**
 2  * Definition for binary tree
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode(int x) { val = x; }
 8  * }
 9  */
10 public class Solution {
11     public List<List<Integer>> levelOrderBottom(TreeNode root) {
12         List<List<Integer>> answer = new ArrayList<List<Integer>>();
13         Queue<TreeNode> q = new LinkedList<TreeNode>();
14         
15         if(root == null)
16             return answer;
17         
18         q.offer(root);
19         int currNodeNum = 1;
20         
21         while(currNodeNum != 0){
22             int nextNodeNum = 0;
23             ArrayList<Integer> currNodeList = new ArrayList<Integer>();
24             while(currNodeNum != 0){
25                 TreeNode node = q.poll();
26                 
27                 currNodeNum--;
28                 currNodeList.add(node.val);
29                 
30                 if(node.left != null){
31                     q.offer(node.left);
32                     nextNodeNum ++;
33                 }
34                 if(node.right != null){
35                     q.offer(node.right);
36                     nextNodeNum++;
37                 }
38                 
39             }
40             answer.add(0,currNodeList);
41             currNodeNum = nextNodeNum;
42         }
43         return answer;
44     }
45 }

上述代码中currNodeNum记录当前层节点的数目,每从队列中弹出一个节点,currNodeNum值减1,当currNodeNum值减为0,当前层次遍历结束。在遍历当前层的过程中,顺便用nextNodeNum统计下一层节点呃个数,每当当前层节点有一个左子或者右子的时候,nextNodeNum值就加1。当下一层没有节点的时候,遍历结束。

第40行代码,是将每层得到的节点list插入到answer的最前面,这样就可以满足题目bottom-up的要求了。

原文地址:https://www.cnblogs.com/sunshineatnoon/p/3850706.html