Loading

二叉树层次遍历

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

层序遍历打印二叉树

    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 @ 2021-05-24 23:15  KeBoom  阅读(250)  评论(0编辑  收藏  举报