zoukankan      html  css  js  c++  java
  • 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],
    ]

      解题思路和level order traversal 一样, 就是最后把输出结果反转一下

     一个queue的方法,reverse 结果

    /**
     * Definition for binary tree
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    public class Solution {
        public ArrayList<ArrayList<Integer>> levelOrderBottom(TreeNode root) {
            ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
            
            if(root == null)
                return result;
                
            LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
            queue.add(root);
            int nextLevelCount = 1;
            
            while(!queue.isEmpty()){
                int curLevel = nextLevelCount;
                nextLevelCount = 0;
                ArrayList<Integer> lvl = new ArrayList<Integer>();
                for(int i = 0; i < curLevel; i++){
                    TreeNode tmp = queue.poll();
                    lvl.add(tmp.val);
                    if(tmp.left != null){
                        queue.add(tmp.left);
                        nextLevelCount++;
                    }
                    if(tmp.right != null){
                        queue.add(tmp.right);
                        nextLevelCount++;
                    }
                }
                result.add(lvl);
            }
            ArrayList<ArrayList<Integer>> reverse = new ArrayList<ArrayList<Integer>>();
            for(int i = result.size()-1; i >= 0; i--){
                reverse.add(result.get(i));
            }
            return reverse;
        }
    }

     用 Stack 和 两个queue 的方法

    public class Solution {
        public ArrayList<ArrayList<Integer>> levelOrderBottom(TreeNode root) {
            ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
            if(root == null)
                return result;
            Stack<ArrayList<Integer>> stack = new Stack<ArrayList<Integer>>();
            stack = traversal(root);
            while(!stack.isEmpty())
                result.add(stack.pop());
            return result;
        }
        private Stack<ArrayList<Integer>> traversal(TreeNode root)
        {
            LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
            Stack<ArrayList<Integer>> result = new Stack<ArrayList<Integer>>();
            queue.add(root);
            while(!queue.isEmpty())
            {
                ArrayList<Integer> tmp = new ArrayList<Integer>();
                LinkedList<TreeNode> tmpqueue = new LinkedList<TreeNode>();
                while(!queue.isEmpty())
                {
                    TreeNode node = queue.poll();
                    tmp.add(node.val);
                    if(node.left != null)
                        tmpqueue.add(node.left);
                    if(node.right != null)
                        tmpqueue.add(node.right);
                }
                result.add(tmp);
                queue = tmpqueue;
            }
            return result;
        }
    }
  • 相关阅读:
    Java之IO(一)InputStream和OutputStream
    bitset库
    assert
    C++ 与 Python 混合编程
    C++多线程
    C++11新特性
    C++性能优化指南
    C++随机数
    C++中struct与class的区别
    C++杂记
  • 原文地址:https://www.cnblogs.com/RazerLu/p/3552466.html
Copyright © 2011-2022 走看看