二叉树的四种遍历方式(二)

40 篇文章 3 订阅
13 篇文章 0 订阅

接上文《二叉树的四种遍历方式(一)》(https://blog.csdn.net/helloworldchina/article/details/128895188),在本文讲述一下第四种遍历方式,即按层次遍历二叉树。

一 讲解

1 先序遍历二叉树, 见《二叉树的四种遍历方式(一)》(https://blog.csdn.net/helloworldchina/article/details/128895188)
2 中序遍历二叉树, 同上;
3 后序遍历二叉树, 同上;
4 层次遍历二叉树, 见下:

按层次遍历二叉树的定义是:
从根开始,按层次的递增顺序和每层从左到右的顺序进行遍历。对于上文中的二叉树,若按层次从左到右进行遍历,则有以下序列:ABFCEGDHI.

要实现按层次遍历,需要使用一个队列来存放要访问的节点,并将节点的值存入新的队列,遍历按照以下方式进行:
1) 先访问根节点,将根节点的值插入新队列;
2) 重复执行以下操作:从队列中取出头节点,依次访问该节点的左孩子、右孩子,直至队列为空;且每个节点访问后,就将该节点的值插入新队列。

二 代码

见方法levelTraveral,其它代码可参见《二叉树的四种遍历方式(一)》(https://blog.csdn.net/helloworldchina/article/details/128895188):


    /**
     * 按照层次遍历二叉树,使用队列(先进先出)实现。
     */
    public void levelTraveral(Node node){
        System.out.print("按照层次遍历二叉树,使用队列实现:");
        System.out.println();
        //节点个数
        int num=0;
        if  (node==null){
            return;
        }
        //1、创建二叉树节点队列
        Queue<Node> queue = new LinkedList<>();
        //2 创建一个存储二叉树中值的队列
        Queue<Object> queueData = new LinkedList<>();
        //3、二叉树节点入队
        queue.add(node);
        //4 二叉树节点值入队
        queueData.add(node.value);
        //队列中有元素则进入循环
        if (queue.size()!=0) {
            num++;
        };
        while (queue.size()!=0){

            //按照栈中元素的个数进行出队循环
            int len = queue.size();
            for(int i = 0;i<len;i++){
                //根节点出队
                Node temp = queue.poll();
                System.out.print(temp.value+" ");
                //如果根节点有左子节点,左子节点入队
                if (temp.leftNode!=null) {
                    queue.add(temp.leftNode);
                    queueData.add(temp.value);
                    num++;

                }
                //如果根节点有左子节点,左子节点入队
                if (temp.rightNode!=null) {
                    queue.add(temp.rightNode);
                    queueData.add(temp.value);
                    num++;

                }
            }
        }
        System.out.println();
        System.out.println("queueData size="+queueData.size());
        System.out.println("num="+num);
    }

package cytdemo;

/**
 * 二叉树遍历测试
 * @author Gyl
 * @date 2023/2/5
 */
public class TestBinaryTree {

    public static void main(String[] args) {
        //手动创建节点
        Node node9 = new Node("I",null,null);
        Node node8 = new Node("H",null,null);
        Node node7 = new Node("G",node8,node9);
        Node node6 = new Node("F",null,node7);
        Node node5 = new Node("D",null,null);
        Node node4 = new Node("E",null,null);
        Node node3 = new Node("C",null,node5);
        Node node2 = new Node("B",node3,node4);
        Node node1 = new Node("A",node2,node6);

        //通过根节点创建一个二叉树对象
        BinaryTree bTree=new BinaryTree(node1);
        //判断是否为空
        System.out.println("是否为空:"+bTree.isEmpty());

        //层次遍历,递归实现
        System.out.println();
        System.out.println("输出层次遍历:");

        bTree.levelTraveral(node1);


    }


三 展示
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值