二叉树层序遍历

二叉树的层序遍历

简介

在数据结构的学习过程中,最为重要的便是遍历了,在之前的文章中,已经阐述过了一些内容,主要是如下所示:

原创 数据结构-树与深度优先遍历

原创 二叉树之使用栈实现深度优先遍历

除了深度优先遍历之外,对于树结构还有一种层序遍历的方式是需要掌握的。

深度优先遍历是在一个方向上一头扎到底,而广度优先遍历则是在各个方向上各自走出一步。

这样的需求应该怎么实现,借助什么样的数据结构?我们都知道要使用队列,为什么栈不行呢?这些问题只有仔细思考才可以。

我们知道,要实现按层次遍历一棵二叉树,首先访问根,这个自然,因为函数会传递二叉树的根进入,然后通过根我们可以访问找到这个根节点的左右子树。即左右子节点。比如说我们此刻访问了节点B,那么怎么才能访问节点C呢?要么我们保存节点C的父亲节点,要么我们直接保存A节点。在通过栈实现深度优先遍历时,我们选择了保存节点的父节点。但在层序遍历的需求下,我们在处理同一层节点,要按照左右的顺序。B节点的孩子和C节点的孩子,B位于C的左边,因此先访问B,再访问C,同样的,也要先访问B的孩子,然后访问C的孩子。这恰恰符合FIFO的特点。因此,我们要通过一个队列来实现层序访问的功能。

代码实现

不打印null

/**
     * 层序遍历二叉树根节点
     *
     * @param root 二叉树根节点
     */
    public static void levelOrderTraverse(Node root) {
        Queue<Node> queue = new LinkedList<Node>();
        queue.add(root);
        while (!queue.isEmpty()) {
            Node node = queue.poll();
            System.out.print(node.getData() + " ");
            if (node.getLeft() != null) {
                queue.add(node.getLeft());
            }
            if (node.getRight() != null) {
                queue.add(node.getRight());
            }
        }

    }

这样的输出结果如下所示:

        List<Integer> source = Arrays.asList(3, 2, 9, null, null, 10, null, null, 8, null, 4);
        LinkedList<Integer> inputList = new LinkedList<Integer>(source);
        Node root = BinaryTree.createBinaryTree(inputList);

使用先根序列创建二叉树。参考原创 数据结构-树与深度优先遍历

        System.out.println();
        System.out.println("使用队列获取二叉树层序遍历");
        levelOrderTraverse(root);

得到的额结果如下所示:

使用队列获取二叉树层序遍历
3 2 8 9 10 4 

但这样把叶子节点的null没有打印。

打印null

打印null的理解,也比较简单,只是把null值也加入队列,统一在出队时进行对值的处理。较为简单,不再赘述。

    /**
     * 层序遍历二叉树根节点
     *
     * @param root 二叉树根节点
     */
    public static void levelOrderTraverse(Node root) {
        Queue<Node> queue = new LinkedList<Node>();
        queue.add(root);
        while (!queue.isEmpty()) {
            Node node = queue.poll();
            if (node == null ) {
                System.out.print("null ");
                continue;
            }
            System.out.print(node.getData() + " ");
            queue.add(node.getLeft());
            queue.add(node.getRight());

        }

    }

此时若运行,则结果如下:

3 2 8 9 10 null 4 null null null null null null 

下载

二叉树层序遍历

总结

 关于二叉树的层序遍历,基本的内容就是这些,在工作中,应刻意练习使用这些二叉树啊、队列、栈这种结构来完成我们的工作需求,同时也加深对于这些小工具的使用。使用的越多,越熟练。这样也越好。

  最近笔者在工作之余,一直在阅读张磊的《价值》一书,这是一本大神在20年疫情期间写的关于投资理念的书,书里面讲述了张磊的人生经历,创建高瓴资本的始末,尤其是磊哥提到的在长期主义之路上,与伟大格局观者同行,做时间的朋友,这些观念都让笔者的视野有了一些变化。**真正的投资,有且只有一条标准,那就是是否在创造真正的价值,这个价值是否有益于社会的整体繁荣。**真希望自己的经历能够更加丰富一点,看问题的视野和角度更开阔一些,人也更加的开放。感谢这个精彩的世界。也希望在阅读这篇博客的诸位,都能永远追求丰富而有益的人生。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值