剑指offer系列——61.序列化二叉树??

Q:请实现两个函数,分别用来序列化和反序列化二叉树
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。
二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
A:这个可以看题目详解,讲的比较清楚:https://www.bilibili.com/video/av51897925
不过这个题……用C真的很麻烦,指针什么的,还是用java或python写会方便。不建议用c。
先序:
递归:

public class Solution {
    String Serialize(TreeNode root) {
        // 序列化为前序遍历序列,空节点用#表示
        String str = "";
        return Serialize(root, str);
    }
    String Serialize(TreeNode root, String str) {
        if (root == null) { //序列化根节点
            str += "#,";
            return str;
        } else
            str += root.val+",";
        str = Serialize(root.left, str); //序列化左子树
        str = Serialize(root.right, str); //序列化右子树
        return str;
    }
    
    int start=-1;
    //反序列化,根据序列重构建树 
    TreeNode Deserialize(String str) {
        if (str == null || str.length() == 0)
            return null;
        String[] strArr = str.split(",");
        return Deserialize(strArr);
    }

    TreeNode Deserialize(String[] strArr) {
        start++;
        if (start < strArr.length && !strArr[start].equals("#")) {
            TreeNode cur = new TreeNode(Integer.parseInt(strArr[start]));
            cur.left = Deserialize(strArr);
            cur.right = Deserialize(strArr);
            return cur;
        }
        return null;
    }
}

非递归:

    char* Serialize(TreeNode *pRoot) {
        string s;
        if (!pRoot)
            return NULL;
        deque<TreeNode*> q;
        q.push_back(pRoot);
        while (!q.empty()) {
            int n = q.size();
            for (int i = 0; i < n; ++i) {
                if (q.front()) {
                    q.push_back(q.front()->left);
                    q.push_back(q.front()->right);
                    s += to_string(q.front()->val) + ' ';
                } else {
                    s += "# ";
                }
                q.pop_front();
            }
        }
        char* chr = strdup(s.c_str());
        return  chr;
    }
    TreeNode* Deserialize(char *str) {
        if (!str)
            return nullptr;
        int k = 0;
        auto ret = nextNode(str, k);
        deque<TreeNode*> q;
        q.push_back(ret);
        while (!q.empty()) {
            int n = q.size();
            for (int i = 0; i < n; ++i) {               
                q.front()->left = nextNode(str, k);
                q.front()->right = nextNode(str, k);
                if (q.front()->left)
                    q.push_back(q.front()->left);
                if (q.front()->right)
                    q.push_back(q.front()->right);
                q.pop_front();
            }
        }
        return ret;
    }
    TreeNode* nextNode(char *str,int &i) {
        string s;
        while (str[i] != ''&&str[i] != ' ') {
            if (str[i] == '#') {
                i += 2;
                return nullptr;
            }
            s += str[i];
            i++;
        }
        if (str[i] == ' ')
            i++;
        if (!s.empty())
            return new TreeNode(stoi(s));
        return nullptr;
    }
原文地址:https://www.cnblogs.com/xym4869/p/12374095.html