107. 二叉树的层次遍历 II
给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其自底向上的层次遍历为:
[
[15,7],
[9,20],
[3]
]
解题思路以及代码
首先这个题是在二叉树的层次遍历的基础上进行的。
可以看一下,我写的这个题解:
LeetCode 102. 二叉树的层序遍历
这里就不在啰嗦层次遍历了。
如果你不懂二叉树的遍历可以看:
我是怎么一步一步调试出来二叉树的遍历(超精彩配图),二叉树遍历再也不用愁了
解这个题时,我们可以使用链表的头插法进行插入。
每一层的List都插入另一个List的头部,即可完成本题。
由于太简单了,所以就不添加注释了。只改动了一个地方:
lists.add(0,list);
核心代码:
static public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> lists = new ArrayList<>();
if(root==null) return lists;
TreeNode treeNode = root;
LinkedList<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()){
int n = queue.size();
int index = 0;
List<Integer> list = new ArrayList<>();
while (index<n){
TreeNode node = queue.pop();
list.add(node.val);
if(node.left!=null)
queue.add(node.left);
if(node.right!=null)
queue.add(node.right);
index++;
}
lists.add(0,list);
}
return lists;
}
全部代码:
package tree.二叉树的层次遍历2;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;
class Solution {
public static void main(String[] args) {
TreeNode t1 = new TreeNode(1);
TreeNode t2 = new TreeNode(2);
TreeNode t3 = new TreeNode(3);
TreeNode t4 = new TreeNode(4);
TreeNode t5 = new TreeNode(5);
t1.left=t2;
t1.right=t3;
t2.left=t4;
t2.right=t5;
System.out.println();
System.out.println("层次遍历:");
List<List<Integer>> lists = levelOrder(t1);
System.out.println("结果:"+lists.toString());
System.out.println("遍历结果:");
lists.stream().forEach(li -> {
li.stream().forEach(ll -> {
System.out.print(ll.intValue()+" ");
});
System.out.println();
});
}
static public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> lists = new ArrayList<>();
if(root==null) return lists;
TreeNode treeNode = root;
LinkedList<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()){
int n = queue.size();
int index = 0;
List<Integer> list = new ArrayList<>();
while (index<n){
TreeNode node = queue.pop();
list.add(node.val);
if(node.left!=null)
queue.add(node.left);
if(node.right!=null)
queue.add(node.right);
index++;
}
lists.add(0,list);
}
return lists;
}
}
class TreeNode {
int val;//每个节点存放的数据
TreeNode left;//左节点
TreeNode right;//右节点
TreeNode(int x) { val = x; }
}
如果对你有帮助,可以分享给你身边的朋友。或者
给俺点个大大的赞和大大的评论
,点赞
和评论
就是给我最大的支持,感谢。
水平有限,难免会有疏漏或者书写不合理的地方,欢迎交流讨论。
作者:TrueDei
作者唯一博客CSDN:https://truedei.blog.csdn.net/
转载说明:如需转载请注明原地址和作者名。
如果喜欢我的文章,还没看够可以关注我,我会用心写好每一篇文章。
欢迎大佬们加入在下的小社,在此大家可以放开的交流,共同学习进步: