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

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

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

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;
        }

得出来是这样的

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三氧化真

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值