层序遍历二叉树类型

数据结构——二叉树层序遍历 来喽来喽~ 二叉树的层序遍历来喽~层序遍历那是相当有趣滴!我的朋友,请不要迷惘,你要记住,你终有鲲鹏一日!加油吧!从现在开始~不知道有没有难住你呢!相信你不会被这些小困难绊倒!说给你,更说给我,现在的努力至少不会辜负这一点青春时光! 阅读详情

1.从上往下打印二叉树(层序遍历)


题目: 往下打印出二叉树的每个节点,同层节点从左至右打印。


思路:使用队列的先进先出的特性,在把队列中的节点取出同时把它的儿子插入队列,从而实现按层顺序打印。

 //层序遍历
    public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
        Queue<TreeNode> queue = new LinkedList<>();
        ArrayList<Integer> list = new ArrayList<>();
        TreeNode cur = null;
        
        queue.add(root);
        if(root == null){
            return list;
        }
        while(!queue.isEmpty()){
            cur = queue.poll();
            list.add(cur.val);
            System.out.println(cur.val);
            if(cur.left != null){
                queue.add(cur.left);
            }
            if(cur.right != null){
                queue.add(cur.right);
            }
        }
        return list;
    }


2.把二叉树打印成多行


思路 : 在层序遍历的基础上,需要记录下每一层的个数,在队列中弹出该层所有节点时,需要换一层输出。

代码如下:

  //使用curNum 记录当前层的节点个数,使用nextNum记录下一层的节点个数,每次对当前层节点做出队操作时,
    // 都需要对curNum-- ,并在该弹出节点的子节点做入队操作时对nextNum做加操作。 ArrayList<ArrayList<Integer>> Print(TreeNode pRoot){

        int curNum = 0 ;
        int nextNum = 0;
        
        Queue<TreeNode> queue = new LinkedList<>();
        ArrayList<ArrayList<Integer>> lists = new ArrayList<>();
        queue.add(pRoot);
        curNum = 1;
        if(pRoot == null){
           
           return lists;
        }
        while (!queue.isEmpty()){
            ArrayList<Integer> list = new ArrayList<>();
            while (curNum > 0){
                TreeNode cur = queue.poll();
                list.add(cur.val);
                if(cur.left != null){
                    queue.add(cur.left);
                    nextNum ++;
                }
                if(cur.right != null){
                    queue.add(cur.right);
                    nextNum ++;
                }
                curNum -- ;
            }
            lists.add(list);
            curNum = nextNum;
            nextNum = 0;
        }
        return lists;
    }




3.按之字形顺序打印二叉树


题目: 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

第一个方法是,在按层打印的基础上,在奇数层时按序打印,在偶数层时进行reverser反转操作。该方法在海量数据时,效率低。

    //第一个方法是,在按层打印的基础上,在奇数层时按序打印,在偶数层时进行reverser反转操作。该方法在海量数据时,效率低。

    public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
            int curNum = 0 ;
            int nextNum = 0 ;
            int level = 0;
            ArrayList<ArrayList<Integer>> lists = new ArrayList<>();
            Queue<TreeNode> queue = new LinkedList<>();

            queue.add(pRoot);
            curNum = 1;

            while (!queue.isEmpty()){
                ArrayList<Integer> list = new ArrayList<>();
                while (curNum > 0 ){
                    TreeNode cur = queue.poll();
                    list.add(cur.val);
                    if(cur.left != null){
                        queue.add(cur.left);
                        nextNum++;
                    }
                    if(cur.right != null){
                        queue.add(cur.right);
                        nextNum++;
                    }
                    curNum --;
                }
                if(level % 2 == 0){
                    lists.add(list);
                }
                else {
                    lists.add(reveser(list));
                }
                curNum = nextNum ;
                nextNum = 0;
                level ++;
            }
    }

    private ArrayList<Integer> reveser(ArrayList<Integer> list){
        int l = 0;
        int r = list.size()-1;
        while(l < r){
            int temp = list.get(l);
            list.set(l, list.get(r)) ;
            list.set(r,temp );
        }
        return list;
    }


第二个方法是,使用栈的先进后出的特性,使用两个栈,倒换从而实现。
//第二个方法是,使用栈的先进后出的特性,使用两个栈,倒换从而实现。
    public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {

        //偶数层时,使用stack1
        Stack<TreeNode> stack1 = new Stack<>();
        //奇数层时,使用stack2
        Stack<TreeNode> stack2 = new Stack<>();

        ArrayList<ArrayList<Integer>> lists = new ArrayList<>();
        int level = 1 ;
        stack1.push(pRoot);
        while (!stack1.isEmpty() || !stack2.isEmpty()){
            if(level % 2 != 0){
                ArrayList<Integer> list = new ArrayList<>();
                while (!stack1.isEmpty()){
                    TreeNode cur = stack1.pop();
                    if(cur != null){
                        list.add(cur.val);
                        stack2.push(cur.left);
                        stack2.push(cur.right);
                    }
                }
                if(list.size() != 0){
                    lists.add(list);
                    level ++;
                }
            }
            else {
                ArrayList<Integer> list = new ArrayList<>();
                while(!stack2.isEmpty()){
                    TreeNode cur = stack2.pop();
                    if(cur != null){
                        list.add(cur.val);
                        stack1.push(cur.right);
                        stack1.push(cur.left);
                    }

                }
                if(list.size() != 0){
                    lists.add(list);
                    level ++;
                }
            }
        }
        return lists;
    }

Go语言算法实战教程:深入学习Golang算法 通过理解树的遍历和重构方法以及特殊形态的二叉树,我们能够在面对各种树相关问题时,选择恰当的数据结构和算法,以达到最优的性能表现。 阅读详情

相关推荐

从玩具车到手机充电:手把手带你用Multisim仿真Buck/Boost电路(附工程文件)

本文通过Multisim仿真软件,手把手教你搭建Buck降压电路和Boost升压电路,实现从12V到5V或3.7V到5V的电压转换。文章详细介绍了电路搭建步骤、关键波形观测技巧及常见故障排查方法,并附赠工程文件,帮助电子爱好者快速掌握电源转换技术。

weixin_29159127的博客 244

【数据结构与算法】【14】以树状形式打印二叉树

技术难点以树状形式打印二叉树的关键难点在于,如何计算和控制每个节点的打印位置解决思路将二叉树的所有节点从左往右全部打印出来,正好和二叉树中序遍历的结果是一样的利用这个特点,我们就可以通过中序遍历结果,来反推每个节点位置,再按广度优先遍历算法,逐行打印即可具体方案和流程图如下二叉树 中序遍历每个字符间要保持一定间隔,所以加上占位符 广度优先遍历保持每个节点横向位置不变,根据广度优先遍历调整节点层次位置 将占位符替换为连接符和空白字符 这样就大功告成了,思路有了,实现就不难了注意细节实现代码这里我们只讲解怎么打

天天向上 Up Up Up (*^▽^*) 4870

逆变器并联--下垂控制引入虚拟阻抗

说明传统下垂控制的缺点、分析虚拟阻抗的原理和实现方法

weixin_58670090的博客 1万+

从零开始的力扣刷题记录-第十七天

开始每天一道中等题

qq_24494293的博客 222

3分钟接入满血版DeepSeek-R1:字节火山引擎手把手教程!免费50万tokens!

3分钟接入满血版DeepSeek-R1:字节火山引擎手把手教程!免费50万tokens!

hunteritself的博客 2万+

墨刀原型设计工具操作使用指南及实践操作

该指南通过异常场景处理、像素级参数说明、复杂交互示例,覆盖了墨刀操作的全细节,适合从新手到资深用户的进阶学习。结合 PlantUML 思维导图的层级化展示,可快速定位具体功能的操作要点与问题解决方法,真正实现 “照指南即可操作” 的实用价值。

hy行者勇哥的博客 4954

数据结构实验之——二叉树层序遍历和竖向打印(超简易)

二叉树的层序遍历和竖向打印说明代码部分测试用例 说明 在这里二叉树的输入方式依旧是根左右,空子树用’ ^ '代替,不清楚的朋友可以简单预览:二叉树表达方式 二叉树的层序遍历在这里是利用队列来实现,而二叉树的竖向打印实际上就像逆序中序遍历一样,这部分的内容并不是很难,大家可以参考。 代码部分 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> #inc

Xmumu_的博客 1898

2023年五一数学建模 | 第二十届五一数学建模C题:“双碳”目标下低碳建筑研究

2023年五一数学建模 | 第二十届五一数学建模C题:“双碳”目标下低碳建筑研究

前程算法屋的博客 1380

后序遍历非递归实现难点全解析,90%程序员都踩过的坑

掌握C语言树的后序遍历非递归实现,破解栈模拟与访问标记难题。适用于算法面试与底层开发,详解双栈法与前驱判断逻辑,避免重复遍历陷阱。思路清晰,代码可复用,值得收藏。

DeepNest的博客 749

蓝牙芯片驱动开发-第11章第1题-WiFi蓝牙共存的关键策略有哪些

蓝牙芯片驱动开发-第11章第1题-WiFi蓝牙共存的关键策略有哪些

weixin_42162924的博客 30

uniapp:APP报错Error: Not Found:Page[2][-1,1;-1,1,0,0,2-0] at view.umd.min.js:1(uniApp安卓苹果ios出现一大堆数字错误)

Error: Not Found:Page[2][一串数字] at view.umd.min.js:1,uniapp在APP端运行报错Error: Not Found:Page[2][-1,1;-1,1,0,0,2-0] at view.umd.min.js:1,uniapp真机运行偶尔出现Not Found:Page[2][-1,28] at view.umd.min.js:1,如何解决uniApp app报错:Not found -1,71 at view.umd.min.js:1,uniapp项目在H

✅ 精选推荐文章 3984

二叉树的层序遍历

二叉树层序遍历:即设根节点所在层数为1,从第一层开始,从上往下,每层从左往右遍历。

weixin_53316121的博客 6494

C语言程序设计——单词的统计和替换

【任务描述】 对任意一篇英文文章,统计其中每个单词分别出现了多少次,并可替换指定的单词。⑶ 对单词进行替换时,允许用户选择全部替换或逐个替换。替换完成后,将文章保存到文件。⑴ 英文文章以文件形式输入。⑵ 统计的结果保存到文件。

m0_60738889的博客 811

代码随想录算法训练营第15天|102.二叉树层序遍历、层序遍历类型题目、226.翻转二叉树、101.对称二叉树

其实方法三和方法四(队列和栈)本质上都是通过可存储的数据结构来暂存待处理的节点,主要是要确定入队列/栈的顺序,对于每层结点,提前统计当前queue中的元素个数size,然后用for循环遍历这size个元素。:(单纯的“优先向右遍历”是不行的,必须要层序遍历!)层序遍历,输出每层的最后一个元素。注:要事先记录下queue的size,因为que.size()在之后的过程中会改变!层序遍历,并用deque来记录每层节点,然后判断deque是否对称。:层序遍历,记录每层的和,和每层节点个数size。

evelynancyyy的博客 1190

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

完全二叉树的层序遍历(模板)以及树的其他类型题

传送门 一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是完美二叉树。对于深度为 D 的,有 N 个结点的二叉树,若其结点对应于相同深度完美二叉树的层序遍历的前 N 个结点,这样的树就是完全二叉树。 给定一棵完全二叉树的后序遍历,请你给出这棵树的层序遍历结果。 输入格式: 输入在第一行中给出正整数 N(≤30),即树中结点个数。第二行给出后序遍历序列,为 N 个不超过 100 的正整数。同一行中所有数字都以空格分隔。 输出格式: 在一行中输出该树的层序遍历序列。所有数字都以 1 个空格分隔,行首

weixin_45187630的博客 700

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

二叉树 | 层序遍历、翻转二叉树、对称二叉树判断

102. 二叉树的层序遍历用一个队列去一层一层的存入数据,每pop一个节点的时候都把这个节点下面的孩子读到队列里,由此实现一层一层的存入数据。用size去记录每层的个数,以区分哪几个元素是一层的,便于读入二维的result数组中类似的题目代码随想录中给出了十道,详见提交记录多加练习,很有趣226. 翻转二叉树递归和迭代(用栈模拟)都能实现注意一定要是前序遍历或者后序遍历101. 对称二叉树用递归实现的,对递归有一点感觉了,

corrr的博客 104

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

二叉树层序遍历的几个力扣例题

层序遍历的几个例题

the_singular的博客 1861

二叉树(四)--层序遍历

这道题是想让我们将完美二叉树的每层像链表一样连起来,从左往右连,最后一个节点指向NULL,这里我们可以创建两个前后节点,前节点来接每次循环的第一个节点,后节点用来更新前节点,不断向后更新,直到循环结束。这个题让我们从右边来看二叉树,换种思路来想,就是每层的最后一个元素,因为我们每层不是会放到队列里面嘛,所以要输出的元素不就可以从队列里面获取嘛,因为要输出右侧的,所以我们在进队列的时候就先进右子树的。这样这道题就做完了。这个题目是让我们求每层的平均值,求每层的平均值不就是求每次队列里面的值的平均值嘛?

candygua的博客 940

二叉树、二叉树的建立及其前、中、层序遍历

一、什么是二叉树 二叉树是数据结构中较为重要的一部分内容。 二叉树常被用于实现二叉查找树和二叉堆。 在计算机科学中,二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”和“右子树”。 根据不同的用途可分为: 1、完全二叉树——若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树。 2...

weixin_43296323的博客 349

二叉树层序遍历

102. 二叉树的层序遍历 难度:中等 题目 给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。 示例: 二叉树:[3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7 返回其层序遍历结果: [ [3], [9,20], [15,7] ] 解题: 实际上就是广度优先遍历,只不过需要记录每一层的个数。 class Solution { public: vector<v

菜鸟不会飞 217

[LeetCode] 102. 二叉树的层序遍历

4.vector v将二叉树每一层进队列的数据存储起来放进vector vv。1.创建一个vector vv,用来存放每一层的数据。2.queue用来存放二叉树的每一层的结点。3.levelsize二叉树每一层的个数,控制二叉树一层一层出。(即逐层地,从左到右访问所有节点)。

m0_73634434的博客 518

数据结构——二叉树的层序遍历

层序遍历 二叉树的遍历的核心问题就是:二维结构的线性化。 简单来说就是以下两个操作: 从结点访问其左、右儿子结点 访问左儿子后,右儿子结点怎么办? 因为树是二维结构,即一个结点是连接了两个结点。当我访问了某个结点的其中一个子结点后,另外一个要怎么办?肯定要把它保存起来,或者把自己保存起来,因为我自己在,我就可以找到另外一个子结点。因此我们需要考虑如何解决上述的问题。方法如下: 需要一个存储结构保存暂时不访问的结点 存储结构:堆栈、队列 什么是层序遍历 层序遍历是比较接近人的思维方式的一种遍

L_T_W_Y的博客 855

102 二叉树层序遍历

层序遍历,每次层的输出是是一个一维数组,整个二叉树的输出结果是二维数组 BFS遍历,依托于队列结构,每次在根节点出栈的时候,将其值加在结果列表中,然后将他的左右孩子节点入队列。 层序遍历相对于BFS,需要知道每一层有多少个节点。 因此,我们需要稍微修改一下代码,在每一层遍历开始前,先记录队列中的结点数量 nn(也就是这一层的结点数量),然后一口气处理完这一层的 n 个结点。 class Solution: def levelOrder(self, root: TreeNode): .

Blankit1的博客 450
上一篇: 二叉树的下一个结点
下一篇: 24.两两交换链表中的节点
coder_flag
博客等级 码龄9年 2粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值