297. 二叉树的序列化与反序列化

131 阅读1分钟

二叉树不能单独根据前序遍历序列来恢复,只有通过前序+中序或者后序+中序才可以唯一确定一棵二叉树。

但是如果记录下了null结点的值,就可以直接根据前序遍历来恢复二叉树

public class Codec {
        //先序遍历序列化二叉树(记录下null结点为#)
        public String serialize(TreeNode root) {
            StringBuilder ans = new StringBuilder();
            dfs(root, ans);
            return ans.toString();
        }

        private void dfs(TreeNode root, StringBuilder sb) {
            if (root == null) {
                sb.append("#,");
                return;
            }
            sb.append(root.val).append(",");
            dfs(root.left, sb);
            dfs(root.right, sb);
        }


        public TreeNode deserialize(String data) {
            String[] arr = data.split(",");
            List<String> list = new LinkedList<>(Arrays.asList(arr));
            return dfs2(list);
        }

        private TreeNode dfs2(List<String> list) {
            if ("#".equals(list.get(0))) {
                list.remove(0);
                return null;
            }
            TreeNode root = new TreeNode(Integer.parseInt(list.get(0)));
            list.remove(0);
            root.left = dfs2(list);
            root.right = dfs2(list);
            return root;
        }
    }