剑指offer 序列化二叉树

题目描述
请实现两个函数,分别用来序列化和反序列化二叉树

这里给出层序遍历和前序遍历两种解法(一种非递归,一种递归)

层序遍历

String Serialize2(TreeNode root) {
        StringBuilder str = new StringBuilder("");
        if(root == null) return str.toString();
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        int count = 1;
        while(count > 0){
            TreeNode node = queue.poll();
            if(node == null) str.append("#,");
            else {
                count--;
                str.append(node.val+",");
                if(node.left != null) count++;
                queue.add(node.left);
                if(node.right != null) count++;
                queue.add(node.right);
            }

        }
        return str.toString();

    }
    TreeNode Deserialize2(String str) {
        if("".equals(str)) return null;
        String[] chs = str.split(",");
        int length = chs.length;
        Queue<TreeNode> queue = new LinkedList<>();
        TreeNode root = new TreeNode(Integer.parseInt(chs[0]));
        queue.add(root);
        int i = 1;
        while(!queue.isEmpty() && i < chs.length){
            TreeNode node = queue.poll();
            String left = chs[i++];
            if(!"#".equals(left)){
                TreeNode newNode = new TreeNode(Integer.parseInt(left));
                node.left = newNode;
                queue.add(newNode);
            }
            if(i < chs.length){
                String right = chs[i++];
                if(!"#".equals(right)) {
                    TreeNode newNode = new TreeNode(Integer.parseInt(right));
                    node.right = newNode;
                    queue.add(newNode);
                }
            }
        }
        return root;
    }

前序遍历(递归)

String Serialize(TreeNode root) {
        StringBuilder builder = new StringBuilder();
        if(root == null){
            return builder.append("#,").toString();
        }

        builder.append(root.val+",").append(Serialize(root.left)).append(Serialize(root.right));
        return builder.toString();
    }
    int now = 0;
    TreeNode Deserialize(String str) {

        String[] strs = str.split(",");
        if(now >= strs.length) return null;
        if("#".equals(strs[now])){
            now++;
            return null;
        }
        TreeNode node = new TreeNode(Integer.parseInt(strs[now]));
        now++;
        node.left = Deserialize(str);
        node.right = Deserialize(str);
        return node;

    }

猜你喜欢

转载自blog.csdn.net/ymybxx/article/details/79920047