Description:
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]
]
题意:给定一颗二叉树,将二叉树按照层次和从最底层到最顶层的次序,存储每一层的所有节点值;
解法:首先,考虑层次遍历,可以利用队列来实现,每次在对头出队节点,后将次节点的所有子节点再入队;因为,每次要存储一层的节点,因此,我们需要记录此层的节点数(在上一层遍历时可以记录下一层的节点数);主要是对队列的操作,具体过程如下:
其中:
- lastLen:记录遍历上一层时入队的子节点数(即当前层应当处理的节点数)
- nodes:存储树节点的队列
- 如果队列非空,执行操作2,否则,结束
- for i <- 1 to lastLen :
- 取得队列中的队头节点后,将其所有子节点入队
我们在2中的每一次循环中出队的所有节点就是这一层需要存储的树节点;
Java
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
LinkedList<List<Integer>> result = new LinkedList<>();
if (root == null) return result;
ArrayDeque<TreeNode> nodes = new ArrayDeque<>();
nodes.addLast(root);
int lastLen = 1;
while (!nodes.isEmpty()) {
int cnt = 0;
List<Integer> levelNode = new ArrayList<>();
while (lastLen-- > 0) {
TreeNode temp = nodes.removeFirst();
levelNode.add(temp.val);
if (temp.left != null) {nodes.addLast(temp.left); cnt++;}
if (temp.right != null) {nodes.addLast(temp.right); cnt++;}
}
result.addFirst(levelNode);
lastLen = cnt;
}
return result;
}
}