力扣107 二叉树的层序遍历
题目:
给你二叉树的根节点 root
,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:[[15,7],[9,20],[3]]
示例 2:
输入:root = [1]
输出:[[1]]
示例 3:
输入:root = []
输出:[]
提示:
- 树中节点数目在范围
[0, 2000]
内 -1000 <= Node.val <= 1000
解题思路:
首先定义一个队列然后将根节点放入到队列中 获取队列的size然后再根据size循环获取到队列的值然后判断该节点有无左子树如果有左子树就先将左子树放入队列然后再将右子树放入队列。具体实现代码如下:
代码:
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
/**
* 二叉树的层序遍历:就是遍历一棵二叉树层序遍历 依次返回从底层到顶层的节点
* 核心思想:1)准备一个队列取出此时队列的size
* 2)弹出节点如果该节点有左节点就先将左节点加入队列再将右节点加入队列,此操作循环size次
*/
public class LevelOrderBottom {
//1.首先定义一个表示二叉树节点类型的类
public static class TreeNode{
public int value;
public TreeNode left;
public TreeNode right;
public TreeNode(int value) {
this.value = value;
}
}
/**
* 定义一个方法层序遍历二叉树并返回从底层到顶层每层的节点的值
* 我们将每一层作为一个List的元素而每一个元素又是一个List这个List里面就是每一层的节点的值
* 所以返回类型为List<List<Integer>>
* @param root
* @return
*/
public List<List<Integer>> levelOrderBottom(TreeNode root){
//2.1首先定义一个list便于最后返回
List<List<Integer>> ans = new LinkedList<>();
//2.2如果根节点为空就返回ans 此时ans为空
if (root == null) {
return ans;
}
//2.3定义一个队列 并首先将根节点放入队列
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
/*
2.4下面就是循环直到queue为空,先取出queue的size然后根据size循环取出queue的值加入新建的LinkedList中再判断取出节点
有无左子树如果有就先将左子树加入queue再将右子树节点加入queue,直到i不小于size意思也就是这一层全部取出完了,将这一层全部
取出完的节点的值都加入到了LinkedList中形成一个链表,又因为要从底层到顶层取出所以每次我们都将新形成的链表加入到ans(ans本身
也是一个链表)的0位置就成了倒序
*/
while (!queue.isEmpty()){
//2.4.1首先取出queue的size
int size = queue.size();
//2.4.2再定义一个链表这个链表就是用来存储每一层节点的值
List<Integer> curAns = new LinkedList<>();
//2.4.3根据size循环先取出queue的一个值将它加入到curAns有左子树就先将左子树加入到queue再将右子树加入到queue
for (int i = 0; i < size; i++) {
TreeNode treeNode = queue.poll();
curAns.add(treeNode.value);
if(treeNode.left != null){
queue.add(treeNode.left);
}
if (treeNode.right != null){
queue.add(treeNode.right);
}
}
//2.5因为要从底层到顶层展示每层节点的值又因为ans本身是一个链表所以每次我们将新形成的链表加入到ans的0位置
ans.add(0,curAns);
}
//2.6最后返回ans
return ans;
}
}
标签:queue,遍历,队列,层序,力扣,二叉树,ans,节点,size
From: https://www.cnblogs.com/ygstudy/p/17019910.html