剑指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

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