二叉树层次遍历

首先我们从最基础的打印二叉树开始!

层序遍历打印二叉树#

    public void printByLevel(Node head) {
        if (head == null) {
            return;
        }
        Queue<Node> queue = new LinkedList<>();
        queue.offer(head);
        while (!queue.isEmpty()) {
            head = queue.poll();
            System.out.print(head.value + " ");
            if (head.left != null) {
                queue.offer(head.left);
            }
            if (head.right != null) {
                queue.offer(head.right);
            }
        }
        System.out.println();
    }

我们创建一个队列,依次将每一层的节点从左到右放入队列中,然后打印之。

二叉树的按层打印#

题目:#

image-20210524211713303

思路:#

根据层序遍历的规律,当我们遍历到当前层最后一个节点时,正好可以访问到下一层的最后一个节点。因此我们用两个节点记录当前层和下一层的最后一个节点。

代码:#

    public void printByLevel(Node head) {
        if (head == null) {
            return;
        }
        Queue<Node> queue = new LinkedList<>();
        int level = 1;
        Node last = head;
        Node nLast = null;
        queue.offer(head);
        System.out.print("Level " + (level++) + " : ");
        while (!queue.isEmpty()) {
            head = queue.poll();
            System.out.print(head.value + " ");
            if (head.left != null) {
                queue.offer(head.left);
                nLast = head.left;
            }
            if (head.right != null) {
                queue.offer(head.right);
                nLast = head.right;
            }
            if (head == last && !queue.isEmpty()) {
                System.out.print("\nLevel " +(level++) + " : ");
                last = nLast;
            }
        }
        System.out.println();
    }

last记录当前层最后一个节点,nlast记录下一层最后一个节点。

层序遍历来序列化二叉树#

题目:#

image-20210524213053685

序列化为字符串:

image-20210524213221508

#!为空节点。

思路:#

层序遍历二叉树,通过字符串拼接即可。

代码:#

    /**
     * 层序遍历来序列化
     * @param head
     * @return
     */
    public String serialByLevel(Node head) {
        if (head == null) {
            return "#!";
        }
        String res = head.value + "!";
        Queue<Node> queue = new LinkedList<>();
        queue.offer(head);
        while (!queue.isEmpty()) {
            head = queue.poll();
            if (head.left != null) {
                res += head.left.value + "!";
                queue.offer(head.left);
            } else {
                res += "#!";
            }
            if (head.right != null) {
                res += head.right.value + "!";
                queue.offer(head.right);
            } else {
                res += "#!";
            }
        }
        return res;
    }

题目2:#

已知序列化后的字符串,反序列化出二叉树

思路:#

遍历字符串,遍历同时生成节点,注意保留head节点,我们最后要返回头结点。

代码:#

    /**
     * 反序列化--层遍历
     * @param levelStr
     * @return
     */
    public Node reconByLevelString(String levelStr) {
        String[] values = levelStr.split("!");
        int index = 0;
        Node head = generateNodeByString(values[index++]);
        Queue<Node> queue = new LinkedList<>();
        if (head != null) {
            queue.offer(head);
        }
        Node node = null;
        while (!queue.isEmpty()) {
            node = queue.poll();
            node.left = generateNodeByString(values[index++]);
            node.right = generateNodeByString(values[index++]);
            if (node.left != null) {
                queue.offer(node.left);
            }
            if (node.right != null) {
                queue.offer(node.right);
            }
        }
        return head;
    }

    private Node generateNodeByString(String val) {
        if ("#".equals(val)) {
            return null;
        }
        return new Node(Integer.parseInt(val));
    }
posted @   KeBoom  阅读(268)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示
主题色彩