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

  • 相关阅读:
    2020软件工程作业——团队03
    2020软件工程作业 ——团队02
    2020软件工程作业05
    2020软件工程作业04
    2020软件工程作业03
    2020软件工程作业02
    2020软件工程作业01
    微服务:基本介绍
    excel模板解析前后设计变化,以及我对此的看法和感受
    纸上得来终觉浅,绝知此事要躬行——Spring boot任务调度
  • 原文地址:https://www.cnblogs.com/sunshineatnoon/p/3850706.html
Copyright © 2011-2022 走看看