zoukankan      html  css  js  c++  java
  • [Leetcode 107 二叉树的层序遍历 II

    Leetcode 107 二叉树的层序遍历 II

    数据结构定义:

    给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
    
    例如:
    给定二叉树 [3,9,20,null,null,15,7],
    
        3
       / 
      9  20
        /  
       15   7
    返回其自底向上的层次遍历为:
    
    [
      [15,7],
      [9,20],
      [3]
    ]
    
    

    广度优先遍历写法:

    /*
    * 思路: 定义一个队列存储某一行的所有节点
    */
    class Solution {
        public List<List<Integer>> levelOrderBottom(TreeNode root) {
            List<List<Integer>> result = new ArrayList<>();
            if(root == null){
                return result;
            }
            Queue<TreeNode> queue =new LinkedList<>();
            queue.offer(root);
            while(!queue.isEmpty()){
                List<Integer> level = new ArrayList<>();
                int size = queue.size();
                for(int i = 0; i < size; i++){
                    TreeNode node =queue.poll();
                    level.add(node.val);
                    if(node.left != null){
                        queue.offer(node.left);
                    }
                    if(node.right != null){
                        queue.offer(node.right);
                    }
                }
                result.add(level);
            }
            Collections.reverse(result);
            return result;
        }
    }
    

    广度优先遍历的另一种写法:

    /*
    * 思路: 使用linkedList的特性,每次数据插入到最前方
    */
    class Solution {
        public List<List<Integer>> levelOrderBottom(TreeNode root) {
            LinkedList<List<Integer>> result = new LinkedList<>();
            if(root == null){
                return result;
            }
            LinkedList<TreeNode> queue = new LinkedList<>();
            queue.offer(root);
            while(!queue.isEmpty()){
                List<Integer> level = new ArrayList<>();
                int size = queue.size();
                for(int i =0;i<size;i++){
                    TreeNode node = queue.poll();
                    level.add(node.val);
                    if(node.left != null){
                        queue.offer(node.left);
                    }
                    if(node.right != null){
                        queue.offer(node.right);
                    }
                }
                result.add(0, level);
            }
            return result;
        }
    }
    

    深度优先遍历:

    /*
    * 思路: 定义一个index记录哪层遍历的节点
    */
    class Solution {
        public List<List<Integer>> levelOrderBottom(TreeNode root) {
            List<List<Integer>> result = new ArrayList<>();
            if(root == null){
                return result;
            }
            dfs(root,result,1);
            Collections.reverse(result);
            return result;
        }
    
        private void dfs(TreeNode root, List<List<Integer>> result, int index) {
            if(root == null){
                return;
            }
            if(index - result.size() > 0){
                result.add(new ArrayList<>());
            }
            result.get(index -1).add(root.val);
            dfs(root.left,result,index + 1);
            dfs(root.right,result,index + 1);
        }
    }
    
    
  • 相关阅读:
    第24课 #pragma使用分析
    第23课 #error和#line使用分析
    第22课 条件编译使用分析
    第21课 宏定义与使用分析
    Codeforces Round #142 (Div. 2)B. T-primes
    SPOJ XMAX
    Uva 10036
    Timus 1009. K-based Numbers
    MBLAST
    ROADS
  • 原文地址:https://www.cnblogs.com/CodingXu-jie/p/14062909.html
Copyright © 2011-2022 走看看