• 剑指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;
        }
    
  • 相关阅读:
    【z02】选择客栈
    JavaEE(22)
    驱动表问题
    影响子查询展开的情况
    SQL*Net message from client
    等值链接和非等值链接
    ||拼接列关联和直接关联区别
    分页SQL优化
    SQL*Net more data to client
    SQL*Net message to client
  • 原文地址:https://www.cnblogs.com/xym4869/p/12374095.html
Copyright © 2020-2023  润新知