zoukankan      html  css  js  c++  java
  • 算法——二叉树的序列化与反序列化

    设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。

    解题思路:

    • 根据二叉树的遍历思想,只要将空节点的表示符号写入字符串,就能根据二叉树的某种遍历,构造出唯一的树。
    • 这里通过二叉树的层序遍历,空节点用#号表示,然后用逗号间隔每个节点的值,构造字符串。
    • 通过队列,从队列头获取节点,根据当前的数值来确定是否该节点是否为空,如果不为空则利用数值生成新的节点,新生成的节点添加到队尾,构造树,直到队列为空,说明没有节点了。
    
    /**
     * created by lippon
     */
    public class Codec {
        // Encodes a tree to a single string.
        public String serialize(TreeNode root) {
            StringBuilder data = new StringBuilder();
            Deque<TreeNode> q = new LinkedList<>(), temp;
            q.offer(root);
    
    		// 层序遍历树
            while(!q.isEmpty()) {
                temp = new LinkedList<>();
                while(!q.isEmpty()){
                    TreeNode cur = q.poll();
                    // 用#号表示空节点
                    if(cur == null) data.append("#");
                    else {
                        data.append(String.valueOf(cur.val));
                        temp.offer(cur.left);
                        temp.offer(cur.right);
    
                    }
                    data.append(",");
                }
    
                q = temp;
            }
    		// 删除最后的逗号
            data.deleteCharAt(data.length() - 1);
    
            return data.toString();
    
            
        }
    
        // Decodes your encoded data to tree.
        public TreeNode deserialize(String data) {
            String[] cache = data.split(",");
            Deque<TreeNode> q = new LinkedList<>();
            TreeNode root = null;
    
            if(cache.length == 0 || cache[0].equals("#")) return root;
    
    		// 定义树根
            root = new TreeNode(Integer.parseInt(cache[0]));
            int idx = 1;
    
            q.add(root);
            
            // 遍历队列
            while(!q.isEmpty()) {
            	// 出队获取队头,当前的数组位置值就是队头节点的子节点值
                TreeNode cur = q.poll();
                if(!cache[idx].equals("#")){
                    cur.left = new TreeNode(Integer.parseInt(cache[idx]));
                    // 子节点不为空,说明它还有孩子在数组中,所以入队
                    q.offer(cur.left);
                }
                idx ++;
                if(!cache[idx].equals("#")){
                    cur.right = new TreeNode(Integer.parseInt(cache[idx]));
                    q.offer(cur.right);
                }
                idx++;
            }
    
            return root;
        }
    }
    
    
  • 相关阅读:
    8张图带你轻松温习 Java 知识.md
    关于 Java 序列化你不知道的 5 件事
    为什么 String 是不可变的?
    如何使用 Nginx 优雅地限流?
    JAVA泛型编程笔记
    java_接口的应用
    java_抽象类应用
    深入理解Java的接口和抽象类
    java_重写与重载的区别
    Java:按值传递还是按引用传递详细解说
  • 原文地址:https://www.cnblogs.com/lippon/p/14117705.html
Copyright © 2011-2022 走看看