首页 > 其他分享 >力扣107 二叉树的层序遍历

力扣107 二叉树的层序遍历

时间:2023-01-02 18:33:21浏览次数:52  
标签:queue 遍历 队列 层序 力扣 二叉树 ans 节点 size

力扣107 二叉树的层序遍历

题目:

给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

示例 1:

img

输入: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

相关文章

  • 14.平衡二叉树(AVL树)
    左旋转思想:当右子树的高度比左子树的高度高时(并且高度差绝对值超过了1时)代码示例:packagecn.com.avlTree;/***平衡二叉树*/publicclassAvlTreeDemo{......
  • 力扣239 滑动窗口最大值
    题目:给你一个整数数组nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k 个数字。滑动窗口每次只向右移动一位。返回......
  • leetcode-606. 根据二叉树创建字符串
    606.根据二叉树创建字符串-力扣(Leetcode)前序遍历/***Definitionforabinarytreenode.*typeTreeNodestruct{*Valint*Left*TreeNode*......
  • 力扣105 根据先序遍历以及中序遍历构建二叉树
    力扣105根据先序遍历以及中序遍历构建二叉树题目:给定两个整数数组preorder和inorder,其中preorder是二叉树的先序遍历,inorder是同一棵树的中序遍历,请构造二叉树......
  • 力扣104 求二叉树的最大深度
    力扣104求二叉树的最大深度题目:给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明:叶子节点是指没有子节点的节点。示......
  • 力扣101 对称树
    力扣101对称树题目:给你一个二叉树的根节点root,检查它是否轴对称。示例1:输入:root=[1,2,2,3,4,4,3]输出:true示例2:输入:root=[1,2,2,null,3,null,3]输出:f......
  • 力扣150 逆波兰表达式求值
    题目:给你一个字符串数组tokens,表示一个根据 逆波兰表示法表示的算术表达式。请你计算该表达式。返回一个表示表达式值的整数。注意:有效的算符为'+'、'-'、'*......
  • BM27 按之字形顺序打印二叉树
    题目描述思路分析这题在上一道层序遍历的基础上会更加方便。我们之前就可以得到每一层的数据,此时只是对每一层的遍历顺序做相应的处理即可注意:1.我们在向tempQueue......
  • 力扣100 相同的树
    力扣100相同的树题目:给你两棵二叉树的根节点p和q,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。示例1:......
  • BM26 求二叉树的层序遍历
    题目描述思路分析外部使用一个容器来存储,借助一个临时的栈来存储每一层的节点,之后根绝临时栈不为空的条件来遍历每一层,并将结果存到容器中代码参考constlevelOrder=......