劍指Offer題目:序列化二叉樹

劍指Offer題目:序列化二叉樹

題目描述
請實現兩個函數,分別用來序列化和反序列化二叉樹

二叉樹的序列化是指:把一棵二叉樹按照某種遍歷方式的結果以某種格式保存爲字符串,從而使得內存中建立起來的二叉樹可以持久保存。序列化可以基於先序、中序、後序、層序的二叉樹遍歷方式來進行修改,序列化的結果是一個字符串,序列化時通過 某種符號表示空節點(#),以 ! 表示一個結點值的結束(value!)。

二叉樹的反序列化是指:根據某種遍歷順序得到的序列化字符串結果str,重構二叉樹。


解題思路

思路:
(1) 層序遍歷思路
(2)先序遍歷思路


完整代碼

import java.util.LinkedList;

public class q62_Serialize_序列化二叉樹 {
    //層序遍歷思路
    String Serialize1(TreeNode root) {
        StringBuilder sb = new StringBuilder();
        if (root == null) return "";
        LinkedList<TreeNode> queue = new LinkedList();
        queue.add(root);
        while (queue.size() != 0) {
            TreeNode node = queue.poll();
            if (node == null) sb.append("#");
            else {
                sb.append(String.valueOf(node.val));
                queue.add(node.left);
                queue.add(node.right);
            }
            sb.append("!");
        }
        return sb.toString();
    }

    //層序遍歷思路
    TreeNode Deserialize1(String str) {
        if (str == null || str.length() == 0) return null;
        String[] ss = str.split("!");
        LinkedList<TreeNode> queue = new LinkedList();
        TreeNode root = new TreeNode(Integer.valueOf(ss[0]));
        int len = ss.length;
        int index = 1;
        queue.add(root);
        while (queue.size() != 0 && index < len) {
            TreeNode node = queue.poll();
            if (node == null) continue;
            String temp = ss[index++];
            if (temp.equals("#")) node.left = null;
            else
                node.left = new TreeNode(Integer.valueOf(temp));
            queue.offer(node.left);
            temp = ss[index++];
            if (temp.equals("#")) node.right = null;
            else
                node.right = new TreeNode(Integer.valueOf(temp));
            queue.offer(node.right);
        }
        return root;
    }


    //先序遍歷思路
    String Serialize2(TreeNode root) {
        if (root == null) return "";
        return preOrder(root);
    }
    //先序遍歷思路
    private String preOrder(TreeNode root) {
        if (root == null) return "#!";
        StringBuilder sb = new StringBuilder(String.valueOf(root.val) + "!");
        sb.append(preOrder(root.left));
        sb.append(preOrder(root.right));
        return sb.toString();
    }
	//先序遍歷思路
    TreeNode Deserialize2(String str) {
        if (str == null || str.length() == 0) return null;
        LinkedList<String> queue = new LinkedList<String>();
        String[] ss = str.split("!");
        for (String s : ss) queue.offer(s);
        return buildTree(queue);
    }
    //先序遍歷思路
    private TreeNode buildTree(LinkedList<String> queue) {
        String temp = queue.poll();
        if (temp.equals("#")) return null;
        TreeNode node = new TreeNode(Integer.valueOf(temp));
        node.left = buildTree(queue);
        node.right = buildTree(queue);
        return node;
    }
}

更多LeetCode題目及答案解析見GitHub: https://github.com/on-the-roads/LeetCode
劍指offer題目及答案解析:https://github.com/on-the-roads/SwordToOffer

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章