首页 > 编程语言 >算法8:LeetCode_二叉树的层序遍历

算法8:LeetCode_二叉树的层序遍历

时间:2022-12-10 22:58:40浏览次数:43  
标签:right TreeNode val 队列 层序 LeetCode 二叉树 new 节点

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

此题比较简单,直接上代码

package code.code_04;

import java.util.*;

/**
 * https://leetcode.cn/problems/binary-tree-level-order-traversal-ii
 * 题目:给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
 *
 * 解题思路:
 * 1. 逐层搜集,首先收集根节点,并存入队列
 * 2. 获取队列元素, 再逐个从队列中取出, 放入数组中; 然后将当前节点的左节点和右节点存入队列
 * 3, 最后将数组存入linklist的首节点中
 *
 * 4. 然后再次遍历队列,取出每个节点的数值放入数组中,然后再将每个节点的左节点和右节点放入队列
 * 5. 最后将数组存入linklist的首节点中
 * 6. 依次类推,直到遍历完所有的节点
 */
public class Code01_BinaryTreeLevelNodeTraversall {

    public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode() {}
        TreeNode(int val) { this.val = val; }
        TreeNode(int val, TreeNode left, TreeNode right) {
            this.val = val;
            this.left = left;
            this.right = right;
        }
    }

    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> ans = new LinkedList<>();
        //边界值判断
        if (root == null) {
            return ans;
        }

        //逐层搜集,首先收集根节点,并存入队列。印证思路第1步
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);

        while (!queue.isEmpty()) {
            //动态队列,队列的长度是会一直发生变化的,所以需要提前记录下长度
            //因为队列是先进先出,所以有了长度就可以直到每一层节点需要弹出的次数
            int size = queue.size();
            ArrayList<Integer> arrayList = new ArrayList();
            //获取队列元素, 再逐个从队列中取出, 放入数组中; 然后将当前节点的左节点和右节点存入队列
            //印证解题思路第2步
            for (int i = 0; i < size; i++) {
                TreeNode node = (TreeNode) (queue.poll());
                arrayList.add(node.val);

                if (node.left != null) {
                    queue.add(node.left);
                }

                if (node.right != null) {
                    queue.add(node.right);
                }
            }
            //最后将数组存入linklist的首节点中,印证解题思路第3步
            //这一步实现了节点从下往上存储
            ans.add(0, arrayList);
        }

        return ans;
    }


    public static void main(String[] args) {
        Code01_BinaryTreeLevelNodeTraversall test = new Code01_BinaryTreeLevelNodeTraversall();
        //构造数组[3,9,20,null,null,15,7], 输出值应该为[[15,7],[9,20],[3]]
        TreeNode node1 = test.new TreeNode(3);
        TreeNode left2 = test.new TreeNode(9);
        TreeNode righ2 = test.new TreeNode(20);

        node1.left = left2;
        node1.right = righ2;

        TreeNode left3 = test.new TreeNode(15);
        TreeNode righ3 = test.new TreeNode(7);
        righ2.left = left3;
        righ2.right = righ3;

        List<List<Integer>> ans = test.levelOrderBottom(node1);
        for (int i = 0; ans != null && i < ans.size(); i++) {
            List<Integer> list = ans.get(i);
            for (int j = 0; j < list.size(); j++) {
                System.out.print(list.get(j) + "  ");
            }
            System.out.println(" ");
        }
    }
}

 

标签:right,TreeNode,val,队列,层序,LeetCode,二叉树,new,节点
From: https://www.cnblogs.com/chen1-kerr/p/16972506.html

相关文章

  • 算法7:平衡二叉树(AVLTree)
    二叉排序树(BST,BinarySortTree)也称二叉查找树(BinarySearchTree),或二叉搜索树。定义:一颗二叉树,满足以下属性:左子树的所有的值小于根节点的值右子树的所有值大于根......
  • [LeetCode] 1324. Print Words Vertically 竖直打印单词
    Givenastring s. Return allthewordsverticallyinthesameorderinwhichtheyappearin s.Wordsarereturnedasalistofstrings,completewith spa......
  • 二叉树的下一个节点
    给定一棵二叉树的其中一个节点,请找出中序遍历序列的下一个节点。/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*l......
  • 重建二叉树
    输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树。/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;......
  • LeetCode HOT 100:搜索旋转排序数组
    题目:33.搜索旋转排序数组题目描述:一个整数数组,数组每个值都不相同,且该整数数组是一个被旋转过的数组。被旋转过的数组是指,由一个递增的数组,从某一个下标开始往后的元素,......
  • 代码随想录——二叉树
    二叉树的递归遍历前序中序后序简单//前序遍历·递归·LC144_二叉树的前序遍历classSolution{publicList<Integer>preorderTraversal(TreeNoderoot){......
  • Leetcode 1691. 堆叠长方体的最大高度
    题目:给你n个长方体cuboids,其中第i个长方体的长宽高表示为cuboids[i]=[widthi,lengthi,heighti](下标从0开始)。请你从cuboids选出一个子集,并将它们堆叠起......
  • [LeetCode] 2049. Count Nodes With the Highest Score
    Thereisa binary treerootedat 0 consistingof n nodes.Thenodesarelabeledfrom 0 to n-1.Youaregivena 0-indexed integerarray parents r......
  • leetcode_D7_70爬楼梯
    1.题目  2.解一  主要思路:自己的想法,内存和时间占用好像都不少。i为爬一个台阶的的个数,j为爬两个台阶的个数,通过循环计算出所有满足i*1+j*2==n的i和j,再对i和j......
  • 【LeetCode】剑指 Offer 30. 包含min函数的栈
    题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数在该栈中,调用min、push及pop的时间复杂度都是O(1)。思路最初看到O(1)复杂度的时候......