当前位置: 首页 > article >正文

二叉树的层序遍历-广度优先遍历

正常来讲二叉树的层序遍历 我们 使用递归 ,来进行 就可以得到正确答案,但是有时候递归比较难以理解,我们今天用队列的形式 来进行二叉树的层序遍历   

我们使用队列对二叉树进行层序遍历的核心思想有两个

1. 我们用队列 记录二叉树每一层的元素 

比如 现在有一个空队列   【】

一个二叉树的 结构如下

1.我们首先把根节点添加到 队列中去   【 1】

2.然后 我们判断 队列是否为空,来进入循环,根节点不为空 进入循环 ,

3.我们把他的左孩子 加入到队列,右孩子 加入到队列  现在队列 元素是 【1,2,3】

4.然后 我们把根节点出队打印,现在头节点变成2,队列元素为【2,3】

5.然后 我们再把头节点左右孩子加入队列 【2,3,4,5】然后头节点出队变成【3,4,5】,然后再把头节点左右孩子加入队列【3,4,5,6,7】然后头节点出队打印,依次循环,直到队列为空

下面来看一下代码实现

node节点

package tree;

public class TreeNode {
    public  int val;
    public TreeNode left;
    public  TreeNode right;
    public  TreeNode(TreeNode left,int val,TreeNode right){
        this.left=left;
        this.val=val;
        this.right=right;
    }
}
  TreeNode node = new TreeNode(new TreeNode(new TreeNode(null,4,null),2,new TreeNode(null,5,null))
                ,1,
                new TreeNode(new TreeNode(null,6,null),3,new TreeNode(null,7,null)));
        ArrayDeque<TreeNode> queue=new ArrayDeque<>();
        queue.add(node);
while (!queue.isEmpty()){
    TreeNode treeNode = queue.poll();
    System.out.print(treeNode.val);
    if(treeNode.left!=null){
        queue.add(treeNode.left);
    }
    if(treeNode.right!=null){
        queue.add(treeNode.right);
    }

}

但是呢这样得出来的结果是这样的

不够优雅,我们如何打印出一个树型结构的层序遍历呢?

首先我们分析  一个二叉树 如上图我画的那个二叉树,第一层 一个元素,第二层 两个元素,第三层是四个元素 ,我们可以打印出 每一层的元素之后,让该元素换行,就可以得到树形结构的二叉树,

但是我们怎么知道每一层的元素个数呢?我们可以引入一个临时变量,来记录我们每一层的元素个数,然后根据我们每一层添加的元素个数,来进行遍历打印

就比如  我们 第一层添加了一个根节点,那么我们就循环打印一次元素,然后记录下添加元素的个数,我们添加元素的个数也就是下一层循环应该遍历的次数

  //广度优先遍历
        TreeNode node = new TreeNode(new TreeNode(new TreeNode(null,4,null),2,new TreeNode(null,5,null))
                ,1,
                new TreeNode(new TreeNode(null,6,null),3,new TreeNode(null,7,null)));
        ArrayDeque<TreeNode> queue=new ArrayDeque<>();
        queue.add(node);
        int count=1;//表示现在队列中的元素 也就是二叉树的层数中的元素  也是for循环循环的次数
        while (!queue.isEmpty()){
            int count1=0;//记录循环中添加了几次元素  添加几次元素  就是 该二叉树层数 的元素个数
            // 比如 第一层的节点 是1  左右两个孩子
            for (int i = 0; i < count; i++) {
                TreeNode node1 = queue.poll();
                System.out.print(node1.val);

                if (node1.left != null) {
                    queue.add(node1.left);
                    count1++;
                }
                if (node1.right != null) {
                    queue.add(node1.right);
                    count1++;
                }
            }
            System.out.println();
        count=count1;
        }

得出来是这样的

就显示的比较优雅,如果想要更优雅,还可以自行加判断


http://www.kler.cn/a/311315.html

相关文章:

  • Bugku CTF_Web——文件上传
  • Nuxt 版本 2 和 版本 3 的区别
  • request爬虫库的小坑
  • 事件循环 -- 资源总结(浏览器进程模型、事件循环机制、练习题)
  • 中文书籍对《人月神话》的引用(161-210本):微软的秘密
  • Spark 的容错机制:保障数据处理的稳定性与高效性
  • 专题四_位运算( >> , << , , | , ^ )_算法详细总结
  • 图新地球-将地图上大量的地标点批量输出坐标到csv文件【kml转excel】
  • 汇编(实现C语言程序的调用)
  • TestDeploy v3.0构思
  • Vue2接入高德地图API实现搜索定位和点击获取经纬度及地址功能
  • 【Python报错已解决】ModuleNotFoundError: No module named ‘sklearn‘
  • 离散化c++
  • Django创建模型
  • 力扣(leetcode)每日一题 1184 公交站间的距离
  • 机器人相关知识的本身和价值
  • C++实现的小游戏
  • 关于Element-ui中el-table出现的表格错位问题解决
  • 启发式生成最佳轨迹ReGentS:超32个智能体生成现实世界的安全关键驾驶场景
  • 数据库(DB、DBMS、SQL)
  • 中关村科金推出得助音视频鸿蒙SDK,助力金融业务系统鸿蒙化提速
  • 蓝桥杯1.确定字符串是否包含唯一字符
  • VS Code远程连接虚拟机
  • 如何用站群服务器做抢购秒杀平台
  • Linux6-vi/vim
  • 使用稀疏和低秩分解的汉克尔结构矩阵进行脉冲噪声去除