LeetCode-107. Binary Tree Level Order Traversal II (java)
阿新 • • 發佈:2019-02-15
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,null,null,15,7]
,
3 / \ 9 20 / \ 15 7
return its bottom-up level order traversal as:
[ [15,7], [9,20], [3] ]
題意
把一個二叉樹自底向上輸出。
思路
第一眼看上去開始想怎麼用棧去解決,是不是要計算樹的深度然後從最大深度的地方開始遍歷等等。
其實想得太多,並沒有看懂例子理解意思。
程式碼
方法中利用佇列的特點先進先出,自頂向下遍歷二叉樹,然後利用list的add(args1,args2)方法,將輸出的二叉樹插入到結果list的最前面,public class Solution { public List<List<Integer>> levelOrderBottom(TreeNode root) { Queue<TreeNode> queue = new LinkedList<TreeNode>(); List<List<Integer>> wrapList = new LinkedList<List<Integer>>(); if(root == null) return wrapList; queue.offer(root); while(!queue.isEmpty()){ int levelNum = queue.size(); List<Integer> subList = new LinkedList<Integer>(); for(int i=0; i<levelNum; i++) { if(queue.peek().left != null) { queue.offer(queue.peek().left); } if(queue.peek().right != null) { queue.offer(queue.peek().right); } subList.add(queue.poll().val); } wrapList.add(0, subList); } return wrapList; } }
實現自底向上輸出。
另外還有利用遞迴解決本題的方法
這個採用遞迴的方法,在每次遞迴時,深度+1,同時建立list用來後面接受樹的值。public class Solution { public List<List<Integer>> levelOrderBottom(TreeNode root) { List<List<Integer>> res = new ArrayList<>(); if(root == null) { return res; } helper(root, 0, res); return res; } public void helper(TreeNode root, int depth, List<List<Integer>> res) { if(root == null) { return; } if(res.size() <= depth) { res.add(0, new ArrayList<Integer>()); } helper(root.left, depth+1, res); helper(root.right, depth+1, res); res.get(res.size() - depth - 1).add(root.val); } }