题目
给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
例如:
给定二叉树[3,9,20,null,null,15,7]
,3 / \ 9 20 / \ 15 7返回其自底向上的层次遍历为:
[ [15,7], [9,20], [3] ]
解题思路
没想到直接自底向上的方法,所以采用自上向下遍历然后把队列反转。
代码实现
/**
* 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) {
List<List<Integer>> reList = new ArrayList(); // 返回的队列
List<TreeNode> nodeList = new ArrayList(); // 装节点的队列
List<Integer> currentLayerList = new ArrayList(); // 装值的队列
// 如果root为空直接返回reList
if (root == null ) {
return reList;
}
// 初始化根节点
nodeList.add(root);
// 循环到树最后一层
while (!nodeList.isEmpty()) {
// 每次循环前装值的队列清空
currentLayerList = new ArrayList();
// 存储下层节点
List<TreeNode> nextNodeList = new ArrayList();
// 当前层的元素装入当前层元素值队列
for (TreeNode tn : nodeList) {
currentLayerList.add(tn.val);
//节点不为空才添加
if (tn.left != null) {
nextNodeList.add(tn.left);
}
if (tn.right != null) {
nextNodeList.add(tn.right);
}
}
// 重置当前装节点的队列
nodeList = nextNodeList;
// 将当前层元素值队列加入 返回队列
reList.add(currentLayerList);
}
// 返回队列由从上之下变为由底至上
List<List<Integer>> newReList = new ArrayList();
int N = reList.size();
for (int i = 0; i < N; i++) {
newReList.add(reList.get(N-i-1));
}
return newReList;
}
}