[leetcode]297. Serialize and Deserialize Binary Tree一般二叉树的编解码

由于一般的前序遍历不能唯一的还原出原本你的二叉树,所以要改变一下:

记录二叉树的结构信息,也就是空节点用符号表示

一般的前序遍历只是记录了节点的前后顺序,通过记录空节点,每一层的结构就可以记录下来

解码的时候可以按照前序的顺序依次还原节点。

 /*
    前序遍历或者层序遍历都可以,前序遍历要保存二叉树的结构信息
    空节点用符号表示
     */
    StringBuilder s = new StringBuilder();
    // Encodes a tree to a single string.
    public String serialize(TreeNode root) {
        preTra(root);
        return new String(s);
    }
    public void preTra(TreeNode root)
    {
        if (root==null)
        {
            //#代表空节点
            s.append("#");
            s.append(",");
            return;
        }
        s.append(root.val);
        s.append(",");
        preTra(root.left);
        preTra(root.right);
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        if (data.length()==0) return null;
        String[] d = data.split(",");
        //用一个链表记录节点,在调用函数中对链表进行改变是会改变堆中真正的链表的
        LinkedList<String> list = new LinkedList<>();
        for (String s :
             d) {
            list.add(s);
        }
        return dehelper(list);
    }
    public TreeNode dehelper(LinkedList<String> list)
    {
        //pollfirst和poll的区别是,前者在为空时会返回null
        String s = list.pollFirst();
        if (s==null||s.equals("#")) return null;
        //按照前序遍历的顺序,依次把节点放回去
        TreeNode cur = new TreeNode(Integer.parseInt(s));
        cur.left = dehelper(list);
        //注意下边这list和上边的list已经不一样了,因为在上边函数中改变了
        // 虽然传入的是list变量的副本,但是原本和副本都是指向一个地址,都会造成改变
        cur.right = dehelper(list);
        return cur;
    }
原文地址:https://www.cnblogs.com/stAr-1/p/8376806.html