1.LeetCode 102.二叉树的层序遍历
题目链接:力扣刷题
文字讲解版:代码随想录
视频链接:B站视频讲解
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
接下来我们再来介绍二叉树的另一种遍历方式:层序遍历。
层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前讲过的都不太一样。
需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。
具体JAVA代码如下:
层次遍历:
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
if(root == null){
return result;
}
// 将root加入到队列中
queue.offer(root);
while (!queue.isEmpty()){
//新建一维数组,存放每一层的数据
List<Integer> list = new ArrayList<>();
int len = queue.size();
// 遍历层级
while (len > 0){
TreeNode temp = queue.poll();
list.add(temp.val);
if(temp.left != null){
queue.offer(temp.left);
}
if(temp.right != null){
queue.offer(temp.right);
}
len--;
}
// 每走一次循环,都要将list数组的东西加载到resule里面去
result.add(list);
}
return result;
}
}
2.LeetCode 107.二叉树的层序遍历
题目链接:力扣刷题
文字讲解版:代码随想录
视频链接:B站视频讲解
给你二叉树的根节点 root
,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:[[15,7],[9,20],[3]] 思路:这题思路和上面102题的解决思路的方法是差不多的,我们最后将返回的数组翻转一下即可。
class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
List<List<Integer>> result = new ArrayList<>();
if(root == null){
return result;
}
queue.offer(root);
while (!queue.isEmpty()){
int len = queue.size();
List<Integer> list = new ArrayList<>();
while (len>0){
TreeNode temp = queue.poll();
list.add(temp.val);
if(temp.left !=null){
queue.offer(temp.left);
}
if(temp.right != null){
queue.offer(temp.right);
}
len --;
}
result.add(list);
}
// 反转二维数组
List<List<Integer>> result2 = new ArrayList<>();
for(int i = result.size()-1;i>=0;i--){
result2.add(result.get(i));
}
return result2;
}
}
3.LeetCode 199.二叉树的右视图
题目链接:力扣刷题
文字讲解版:代码随想录
视频链接:B站视频讲解
给定一个二叉树的 根节点 root
,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例 1:
输入: [1,2,3,null,5,null,4] 输出: [1,3,4]
思路:我们还是参考层序遍历,首先还是判断队列不为空,其次我们进行for循环
当我们进行遍历到最后一个的时候,我们将数据插入到数组中。
java代码具体如下:
class Solution {
public List<Integer> rightSideView(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
List<Integer> list = new ArrayList<>();
if(root == null){
return list;
}
queue.offer(root);
while (!queue.isEmpty()){
int len = queue.size();
// 进行for循环,从0到每一层的个数,走到最后一个的时候进行判断处理。
for(int i = 0; i < len;i++){
TreeNode temp = queue.poll();
if(temp.left != null){
queue.offer(temp.left);
}
if(temp.right != null){
queue.offer(temp.right);
}
// 当进行遍历到这一层的最后一个的时候,我们就将这个数据加入到list中
if(i == len -1){
list.add(temp.val);
}
}
}
return list;
}
}
4.LeetCode 637.二叉树的平均值
题目链接:力扣刷题
文字讲解版:代码随想录
视频链接:B站视频讲解
给定一个非空二叉树的根节点 root
, 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5
以内的答案可以被接受。
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:[3.00000,14.50000,11.00000] 解释:第 0 层的平均值为 3,第 1 层的平均值为 14.5,第 2 层的平均值为 11 。 因此返回 [3, 14.5, 11] 。
java代码如下:
class Solution {
public List<Double> averageOfLevels(TreeNode root) {
List<Double> result = new ArrayList<>();
if(root == null){
return result;
}
Deque<TreeNode> deque = new LinkedList<>();
deque.offerLast(root);
while (!deque.isEmpty()){
double sumtotal =0.0 ;
int len =deque.size();
for(int i =0 ;i <len;i++){
TreeNode temp = deque.pollFirst();
sumtotal += temp.val;
if(temp.left != null){
deque.offerLast(temp.left);
}
if(temp.right != null){
deque.offerLast(temp.right);
}
}
result.add(sumtotal/len);
}
return result;
}
}
5.LeetCode 429.N叉树的层序遍历
题目链接:力扣刷题
文字讲解版:代码随想录
视频链接:B站视频讲解
给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。
树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。
示例 1:
输入:root = [1,null,3,2,4,null,5,6] 输出:[[1],[3,2,4],[5,6]]
java代码如下:
class Solution {
public List<List<Integer>> levelOrder(Node root) {
Deque<Node> queue = new LinkedList<>();
List<List<Integer>> result = new ArrayList<>();
if(root == null){
return result;
}
queue.offerLast(root);
while (!queue.isEmpty()){
int len = queue.size();
List<Integer> list = new ArrayList<>();
for(int i =0;i < len;i++){
Node temp = queue.pollFirst();
list.add(temp.val);
List<Node> children = temp.children;
// 如果某个节点的孩子数为0,那我们就继续。
if(children == null || children.size() ==0){
continue;
}
// 遍历孩子数
for(Node child : children ){
queue.offerLast(child);
}
}
result.add(list);
}
return result;
}
}
6.LeetCode 116.填充每个节点的下一个右侧结点指针
题目链接:力扣刷题
文字讲解版:代码随想录
视频链接:B站视频讲解
给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
struct Node { int val; Node *left; Node *right; Node *next; }
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL
。
初始状态下,所有 next 指针都被设置为 NULL
。
java代码如下:
class Solution {
public Node connect(Node root) {
Queue<Node> queue = new LinkedList<>();
if(root == null){
return root;
}
queue.add(root);
while (!queue.isEmpty()){
int len = queue.size();
Node temp = queue.poll();
if(temp.left != null){
queue.offer(temp.left);
}
if(temp.right != null){
queue.offer(temp.right);
}
//第一个元素在上面已经被取出来了,所以循环需要从1开始
for(int index =1;index<len;index++){
Node next = queue.poll();
// 我们要将第二个取出的元素的左右孩子也要加入到队列中。
if(next.left != null){
queue.offer(next.left);
}
if(next.right != null){
queue.offer(next.right);
}
// 同一层取出的下一区域为next
temp.next = next;
// temp 为第二个节点了
temp = next;
}
}
return root;
}
}
7.LeetCode 117.填充每个节点的下一个右侧结点指针2
题目链接:力扣刷题
文字讲解版:代码随想录
视频链接:B站视频讲解
给定一个二叉树:
struct Node { int val; Node *left; Node *right; Node *next; }
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL
。
初始状态下,所有 next 指针都被设置为 NULL
。
示例 1:
输入:root = [1,2,3,4,5,null,7] 输出:[1,#,2,3,#,4,5,7,#] 解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化输出按层序遍历顺序(由 next 指针连接),'#' 表示每层的末尾。
Java代码如下:
class Solution {
public Node connect(Node root) {
Queue<Node> queue = new LinkedList<>();
if (root != null) {
queue.add(root);
}
while (!queue.isEmpty()) {
int size = queue.size();
Node node = null;
Node nodePre = null;
for (int i = 0; i < size; i++) {
if (i == 0) {
nodePre = queue.poll(); // 取出本层头一个节点
node = nodePre;
} else {
node = queue.poll();
nodePre.next = node; // 本层前一个节点 next 指向当前节点
nodePre = nodePre.next;
}
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
}
nodePre.next = null; // 本层最后一个节点 next 指向 null
}
return root;
}
}