【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的要求了。

你可能感兴趣的:(LeetCode)