zoukankan      html  css  js  c++  java
  • 【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的要求了。

  • 相关阅读:
    uva 10369 Arctic Network
    uvalive 5834 Genghis Khan The Conqueror
    uvalive 4848 Tour Belt
    uvalive 4960 Sensor Network
    codeforces 798c Mike And Gcd Problem
    codeforces 796c Bank Hacking
    codeforces 768c Jon Snow And His Favourite Number
    hdu 1114 Piggy-Bank
    poj 1276 Cash Machine
    bzoj 2423 最长公共子序列
  • 原文地址:https://www.cnblogs.com/sunshineatnoon/p/3850706.html
Copyright © 2011-2022 走看看