给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
例如: 给定二叉树 [3,9,20,null,null,15,7],
3 / \ 9 20 / \ 15 7
返回其自底向上的层次遍历为:
[ [15,7], [9,20], [3] ]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
要么广度优先搜索要么treeWalk,感觉treewWalk实现起来简单一点:
class Solution {
private void treeWalk(TreeNode node, List<List<Integer>> ans, int level) {
if(node == null)
return;
if(ans.size() - 1 < level) {
ans.add(new LinkedList<Integer>());
}
ans.get(level).add(node.val);
treeWalk(node.left, ans, level + 1);
treeWalk(node.right, ans, level + 1);
}
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> ans = new ArrayList<List<Integer>>();
treeWalk(root, ans, 0);
Collections.reverse(ans);
return ans;
}
}
缺点可能是最后需要reverse一遍,以及在前进过程中需要记录当前是第几层。
也可以用深度或者广度优先。深度优先搜索实现起来的感觉应该跟treewalk差不多,不实现了,实现了一下广度优先搜索,仍然采用记录当前层级最后反转的思路:
class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> ans = new ArrayList<List<Integer>>();
LinkedList<TreeNode> nodeQueue = new LinkedList<TreeNode>();
LinkedList<Integer> levelQueue = new LinkedList<Integer>();
nodeQueue.add(root);
levelQueue.add(0);
while(!nodeQueue.isEmpty()) {
int level = levelQueue.pollFirst();
TreeNode node = nodeQueue.pollFirst();
if(node == null)
continue;
if(ans.size() <= level) {
ans.add(new LinkedList<Integer>());
}
ans.get(level).add(node.val);
nodeQueue.add(node.left);
nodeQueue.add(node.right);
levelQueue.add(level + 1);
levelQueue.add(level + 1);
}
Collections.reverse(ans);
return ans;
}
}
看了一下题解,是可以逐层处理的,那样就不需要记录层级和最后反转了:
class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> ans = new LinkedList<List<Integer>>();
if(root == null)
return ans;
LinkedList<TreeNode> nodeQueue = new LinkedList<TreeNode>();
nodeQueue.add(root);
while(!nodeQueue.isEmpty()) {
List<Integer> cur = new LinkedList<Integer>();
int curLevelSize = nodeQueue.size();
for(int i = 0; i < curLevelSize; ++i) {
TreeNode node = nodeQueue.pollFirst();
cur.add(node.val);
if(node.left != null)
nodeQueue.add(node.left);
if(node.right != null)
nodeQueue.add(node.right);
}
ans.add(0, cur);
}
return ans;
}
}
优秀啊题解