首页 > 代码库 > 【leetcode刷题笔记】Binary Tree Level Order Traversal II

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