Binary Tree Level Order Traversal II 二叉树按层遍历(反向输出)@LeetCode

来源:互联网 发布:linux 播放 4k 视频 编辑:程序博客网 时间:2024/05/16 12:46

树的Level Order Traversal加上ArrayList翻转


package Level3;import java.util.ArrayList;import java.util.LinkedList;import java.util.Queue;import Utility.TreeNode;/** * 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   7return its bottom-up level order traversal as:[  [15,7]  [9,20],  [3],]confused what "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ.OJ's Binary Tree Serialization:The serialization of a binary tree follows a level order traversal, where '#' signifies a path terminator where no node exists below.Here's an example:   1  / \ 2   3    /   4    \     5The above binary tree is serialized as "{1,2,3,#,#,4,#,#,5}". * */public class S107 {public static void main(String[] args) {}public ArrayList<ArrayList<Integer>> levelOrderBottom(TreeNode root) {ArrayList<ArrayList<Integer>> ret = new ArrayList<ArrayList<Integer>>();if(root == null){return ret;}        Queue<TreeNode> queue = new LinkedList<TreeNode>();        queue.add(root);                ArrayList<ArrayList<Integer>> alal = new ArrayList<ArrayList<Integer>>();        ArrayList<Integer> al = new ArrayList<Integer>();                // 记录两个当前level和下一个level的node数目        int currentLevel = 1;        int nextLevel = 0;                while( !queue.isEmpty() ){        TreeNode cur = queue.remove();        currentLevel--;        al.add(cur.val);                if(cur.left != null){        queue.add(cur.left);        nextLevel++;        }        if(cur.right != null){        queue.add(cur.right);        nextLevel++;        }                if(currentLevel == 0){        alal.add(al);        al = new ArrayList<Integer>();        currentLevel = nextLevel;        nextLevel = 0;        }        }                // 翻转ArrayList        for(int i=alal.size()-1; i>=0; i--){        ret.add(alal.get(i));        }                return ret;    }}


/** * 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>> ret = new ArrayList<ArrayList<Integer>>();        if(root == null){            return ret;        }        LinkedList<TreeNode> queue = new LinkedList<TreeNode>();        queue.add(root);        int curLevCnt = 1;        int nextLevCnt = 0;        ArrayList<Integer> al = new ArrayList<Integer>();        while(!queue.isEmpty()){            TreeNode cur = queue.remove();            curLevCnt--;            al.add(cur.val);            if(cur.left != null){                queue.add(cur.left);                nextLevCnt++;            }            if(cur.right != null){                queue.add(cur.right);                nextLevCnt++;            }                        if(curLevCnt == 0){                curLevCnt = nextLevCnt;                nextLevCnt = 0;                ret.add(al);                al = new ArrayList<Integer>();            }        }        ArrayList<ArrayList<Integer>> ret2 = new ArrayList<ArrayList<Integer>>();        for(int i=ret.size()-1; i>=0; i--){            ret2.add(ret.get(i));        }                return ret2;    }}