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] ] 复制代码
给定一个二叉树,返回其节点值的自底向上顺序遍历。(即从左到右,从叶到根,一层一层地)。node
例如: 给定二叉树[3,9,20,null,null,15,7],git
3 / \ 9 20 / \ 15 7 复制代码
返回自底向上的顺序遍历,以下: [ [15,7], [9,20], [3] ]github
本题是倒叙输出一棵树的层次,哎呦,不就是层级遍历嘛,上一篇刚刚写过,至于倒序,那就是小问题了。我们用linkedArrayList代替队列(虽然是由这个实现的,可是没有用到队列的特色。因此直接用了list,这边使用替换,代替了上次操做的remove,相对来讲,效率会好一点数组
按照层级遍历的方式bash
public List<List<Integer>> levelOrderBottom(TreeNode root) {
if (root == null) {
return new ArrayList<>();
}
List<List<Integer>> lists = new LinkedList<>();
List<TreeNode> queue = new LinkedList<>();
List<Integer> list = new ArrayList<>();
list.add(root.val);
lists.add(list);
putNode(root, queue);
while (queue.size() > 0) {
List<Integer> resultTmep = new ArrayList<>();
List<TreeNode> temp = new LinkedList<>();
for (TreeNode treeNode : queue) {
resultTmep.add(treeNode.val);
putNode(treeNode, temp);
}
queue = temp;
lists.add(0,resultTmep);
}
return lists;
}
private void putNode(TreeNode treeNode, List<TreeNode> list) {
if (treeNode == null) {
return;
}
if (treeNode.left != null) {
list.add(treeNode.left);
}
if (treeNode.right != null) {
list.add(treeNode.right);
}
}
复制代码
时间复杂度: 该方案用了层级遍历的方式,时间复杂度至关于每个的遍历,因此为O(n)=O(n)ui
空间复杂度: 该方案使用了额外的空间,使用了数组暂存树,至关于把树转化为了数组,因此空间复杂度O(n)=O(n)spa
本题的大体解法如上所诉,相对于空间开销是差很少,效率提高很多,果真remove仍是有点麻烦的。翻译