zoukankan      html  css  js  c++  java
  • [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;
        }
  • 相关阅读:
    第二章、Redis入门介绍
    最高的牛
    增减序列
    激光炸弹
    分形之城
    约数之和
    奇怪的汉诺塔
    费解的开关
    递归实现排列型枚举
    递归实现组合型枚举
  • 原文地址:https://www.cnblogs.com/stAr-1/p/8376806.html
Copyright © 2011-2022 走看看