zoukankan      html  css  js  c++  java
  • 二叉树的序列化和反序列化


    import java.util.LinkedList;
    import java.util.Queue;

    /**
    * 序列化和反序列化二叉树
    * 先序、后序
    * (中序不能实现)
    * 按层
    */
    public class SerializeAndReconstructTree {

    /**
    * 先序序列化
    *
    * @param head 头结点
    * @return 序列化结果
    */
    public Queue<String> preSerialize(Node head) {
    Queue<String> queue = new LinkedList<>();
    pres(head, queue);
    return queue;
    }

    private void pres(Node head, Queue<String> queue) {
    if (head == null) {
    queue.add(null);
    } else {
    queue.add(String.valueOf(head.value));
    pres(head.left, queue);
    pres(head.right, queue);
    }
    }

    /**
    * 先序反序列化
    *
    * @param queue 序列化队列
    * @return 二叉树
    */
    public Node buildByPreQueue(Queue<String> queue) {
    if (queue == null || queue.isEmpty()) {
    return null;
    }
    return preb(queue);
    }

    private Node preb(Queue<String> queue) {
    String value = queue.poll();
    if (value == null) {
    return null;
    }
    Node head = new Node(Integer.parseInt(value));
    head.left = preb(queue);
    head.right = preb(queue);
    return head;
    }

    /**
    * 按层序列化
    */
    public Queue<String> levelSerialize(Node head) {
    Queue<String> result = new LinkedList<>();
    if (head == null) {
    result.add(null);
    return result;
    }
    result.add(String.valueOf(head.value));
    Queue<Node> queue = new LinkedList<>();
    queue.add(head);
    while (!queue.isEmpty()) {
    Node node = queue.poll();
    if (node.left != null) {
    result.add(String.valueOf(node.left.value));
    queue.add(node.left);
    } else {
    result.add(null);
    }
    if (node.right != null) {
    result.add(String.valueOf(node.right.value));
    queue.add(node.right);
    } else {
    result.add(null);
    }
    }
    return result;
    }

    /**
    * 按层反序列化
    */
    public Node levelBuild(Queue<String> levelList) {
    if (levelList == null || levelList.isEmpty()) {
    return null;
    }
    Node head = generateNode(levelList.poll());
    Queue<Node> queue = new LinkedList<>();
    if (head != null) {
    queue.add(head);
    }
    Node node = null;
    while (!queue.isEmpty()) {
    node = queue.poll();
    node.left = generateNode(levelList.poll());
    if (node.left != null) {
    queue.add(node.left);
    }
    node.right = generateNode(levelList.poll());
    if (node.right != null) {
    queue.add(node.right);
    }
    }
    return head;
    }

    private Node generateNode(String value) {
    if (value == null) {
    return null;
    }
    return new Node(Integer.parseInt(value));
    }

    /**
    * 二叉树结构
    */
    public class Node {

    public int value;

    public Node left;

    public Node right;

    public Node(int value) {
    this.value = value;
    }

    }

    }

    /* 如有意见或建议,欢迎评论区留言;如发现代码有误,欢迎批评指正 */
  • 相关阅读:
    hwclock设置时间的调用过程是怎样的?
    git如何获取获取子模块的代码?
    hwclock和date源码分析
    linux内核是如何支持深度睡眠(deep sleep)方式的?
    mac下如何安装python3?
    linux内核中的__cpu_suspend是在哪里实现的呀?
    linux下安装oracle需要的配置
    linux实操常用命令总结
    linux下vi命令大全
    PHP100精华:很靠谱linux常用命令
  • 原文地址:https://www.cnblogs.com/laydown/p/12865662.html
Copyright © 2011-2022 走看看