1 题目
leetcode
给定一个二叉树,返回其节点值自底向上的层次遍历。(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历。)
2 解
其实就是宽度优先遍历的变体,但是之前没做过,所以自己解的时候有点费时间。用了栈和两个队列,如果拷贝的集合用栈的话会出问题。因为从第一层到第二层的时候,需要先压右边再压左边,这样子出栈的时候就是先左后右,但是也导致了第二层到第三层的时候,先压入了左边节点的子树,再压入右边节点的子树,出栈的时候会先出右子树,导致结果错误。
public List<List<Integer>> levelOrderBottom(TreeNode root) {
if (root == null) {
return new ArrayList<List<Integer>>();
}
Stack<TreeNode> nodeStack = new Stack<>();
Stack<List<Integer>> listStack = new Stack<>();
nodeStack.push(root);
while (!nodeStack.isEmpty()) {
// 取出值
List<Integer> temp = new ArrayList<Integer>();
List<TreeNode> nodeListCopy = new ArrayList<TreeNode>();
// Stack<TreeNode> nodeStackCopy = (Stack<TreeNode>) nodeStack.clone();
while (!nodeStack.isEmpty()) {
//先出左再出右
TreeNode tempNode=nodeStack.pop();
temp.add(tempNode.val);
nodeListCopy.add(tempNode);
}
listStack.add(temp);
// 压入
for(int i = nodeListCopy.size()-1;i>=0;i--) {
TreeNode treeNode=nodeListCopy.get(i);
//先右 后左
if (treeNode.right != null) {
nodeStack.push(treeNode.right);
}
if (treeNode.left != null) {
nodeStack.push(treeNode.left);
}
}
}
List<List<Integer>> list = new ArrayList<>();
while (!listStack.isEmpty()) {
list.add(listStack.pop());
}
return list;
}
3 官解
官解使用了队列来存储,每次插入的时候使用List的add(0,list)方法直接在头插入。
class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> levelOrder = new LinkedList<List<Integer>>();
if (root == null) {
return levelOrder;
}
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);
while (!queue.isEmpty()) {
//行list
List<Integer> level = new ArrayList<Integer>();
//因为在for循环的过程中队列的大小在改变,所以先用一个数存起来,防止访问过头。
int size = queue.size();
for (int i = 0; i < size; i++) {
//取出在队列头的节点
TreeNode node = queue.poll();
level.add(node.val);
TreeNode left = node.left, right = node.right;
//非空判断
if (left != null) {
queue.offer(left);
}
if (right != null) {
queue.offer(right);
}
}
//头插入
levelOrder.add(0, level);
}
return levelOrder;
}
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/solution/er-cha-shu-de-ceng-ci-bian-li-ii-by-leetcode-solut/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
4 结语
树的问题还是比较难啊,对集合类还要更熟悉一些。
5 参考链接
1.官解