给定一个二叉树,返回其节点值自底向上的层序遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其自底向上的层序遍历为:
[
[15,7],
[9,20],
[3]
]
队列即可
var levelOrderBottom = function(root) {
// 队列
var ret = [];
var queue = [root];
while (queue.length !== 0) {
var list = [];
var cnt = queue.length;
while (cnt-- > 0) {
var node = queue[0];
queue = queue.slice(1, queue.length);
if (node === null)
continue;
list.push(node.val);
queue.push(node.left);
queue.push(node.right);
}
if (list.length !== 0) {
console.log(list);
ret.push(list);
}
}
return ret.reverse();
};func levelOrder(root *TreeNode) [][]int {
var res [][]int
q := []*TreeNode{root}
for len(q) != 0 {
var list []int
cnt := len(q)
for cnt > 0 {
cnt--
node := q[0]
q = q[1:]
if node == nil {
continue
}
list = append(list, node.Val)
q = append(q, node.Left)
q = append(q, node.Right)
}
if len(list) != 0 {
res = append(res, list)
}
}
return res
}class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> ret = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
List<Integer> list = new ArrayList<>();
int cnt = queue.size();
while (cnt-- > 0) {
TreeNode node = queue.poll();
if (node == null) continue;
list.add(node.val);
queue.add(node.left);
queue.add(node.right);
}
if (list.size() != 0) ret.add(list);
}
return ret;
}
}