zoukankan      html  css  js  c++  java
  • Binary Tree Level Order Traversal II

    这道题A的略烦

    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]
    ]
     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     int height;
    12     TreeNode root;
    13     
    14     public List<List<Integer>> levelOrderBottom(TreeNode root) {
    15         this.height = getDepth(root);//获取树的高度
    16         this.root = root;
    17         
    18         List<List<Integer>> list = new ArrayList<List<Integer>>();
    19         for(int i = 0; i < height; i++){
    20             List<Integer> element = new ArrayList<Integer>();
    21             list.add(element);
    22         }//this.height没有错
    23         preOrder(root, list);
    24         
    25         return list;
    26     }
    27     
    28     /**
    29      * node在tree中高度
    30      * @param root
    31      * @param node
    32      * @return
    33      */
    34     public int getDepth(TreeNode root, TreeNode node){
    35         if(null == root)
    36             return -Integer.MAX_VALUE;
    37         if(node == root)
    38             return 1;
    39         else{
    40             int maxl = getDepth(root.left, node);
    41             int maxr = getDepth(root.right, node);
    42             if(maxl > maxr)
    43                 return maxl + 1;
    44             else
    45                 return maxr + 1;
    46         }
    47     }
    48     /**
    49      * 获取树的高度
    50      * @param root
    51      * @return
    52      */
    53     public int getDepth(TreeNode root){
    54         if(null == root){
    55             return 0;
    56         }else{
    57             int maxl = getDepth(root.left);
    58             int maxr = getDepth(root.right);
    59             return maxl>maxr ? (maxl + 1):(maxr + 1);
    60         }
    61     }
    62     /**
    63      * 前序遍历树
    64      * @param root
    65      */
    66     public void preOrder(TreeNode root, List<List<Integer>> list){
    67         if(null != root){
    68             int height = getDepth(this.root, root);
    69             List<Integer> element = list.get(this.height - height);
    70             element.add(root.val);
    71             preOrder(root.left, list);
    72             preOrder(root.right, list);
    73         }
    74     }
    75 }

     ps:DFS实现

     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 
    12     public List<List<Integer>> levelOrderBottom(TreeNode root) {
    13         List<List<Integer>> container = new ArrayList<List<Integer>>();
    14         if(null == root){
    15             return container;
    16         }
    17         //List<TreeNode> theSameLevel = new ArrayList<TreeNode>();//存放同一层节点
    18         Queue<TreeNode> theSameLevel = new LinkedList<TreeNode>();
    19         theSameLevel.add(root);
    20         while(!theSameLevel.isEmpty()){//theSameLevel不为空
    21             List<Integer> oneLevel = new ArrayList<Integer>();
    22             Queue<TreeNode> temp = new LinkedList<TreeNode>();//暂存同一层的结点
    23             while(!theSameLevel.isEmpty()){
    24                 TreeNode cur = theSameLevel.remove();
    25                 oneLevel.add(cur.val);
    26                 if(null != cur.left) 
    27                     temp.add(cur.left);
    28                 if(null != cur.right)
    29                     temp.add(cur.right);
    30             }
    31             theSameLevel = temp;
    32             container.add(0, oneLevel);
    33         }
    34         
    35         return container;
    36         
    37     }
    38     
    39    
    40 }
  • 相关阅读:
    go基础_defer
    go基础_函数
    go基础_控制语句
    go基础_数组
    go基础_切片
    go命令行参数
    Hdu2795Billboard线段树
    Hdu1394Minimum Inversion Number线段树
    Hdu1754单点更新
    Hdu1166单点更新线段树
  • 原文地址:https://www.cnblogs.com/luckygxf/p/4085070.html
Copyright © 2011-2022 走看看