首页 > 其他分享 >序列化和反序列化二叉搜索树

序列化和反序列化二叉搜索树

时间:2023-09-04 13:36:10浏览次数:31  
标签:code TreeNode cur 二叉 搜索 序列化 root string

设计一个算法来序列化和反序列化二叉搜索树
对序列化/反序列化算法的工作方式没有限制
您只需确保二叉搜索树可以序列化为字符串,并且可以将该字符串反序列化为最初的二叉搜索树。

1. 非递归先序遍历 + 编码

class Codec {
public:
    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {
        string code = "";
        stack<TreeNode*> s;
        while(root||!s.empty()){
            if(root){
                code+=to_string(root->val);
                code.push_back('.');//用于分割所有权值
                s.push(root);
                root = root->left;
            }
            else{
                code.push_back('#');
                code.push_back('.');
                root = s.top(); s.pop();//回到上一层
                root = root->right;//往右走
            }
        }
        return code;
    }

    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        TreeNode* root = new TreeNode(-1);
        TreeNode* cur = root;
        stack<TreeNode*> s;
        istringstream iss(data);
        string c;
        while (getline(iss, c, '.')){
            if(c.size()==0) continue;//跳过空字符串
            if(c=="#"){
                cur->val = -1;//后面再删除
                if(!s.empty()){
                    cur = s.top(); s.pop();
                    cur->right = new TreeNode(-1);
                    cur = cur->right;//移动到右边
                }
            }
            else{
                s.push(cur);//储存,还要处理右指针
                cur->val = stoi(c);
                cur->left = new TreeNode(-1);
                cur = cur->left;
            }
        }
        return f(root);
    }
    TreeNode* f(TreeNode* root){ //剔除空节点
        if(!root||root->val==-1) return nullptr;
        root->left = f(root->left);
        root->right = f(root->right); 
        return root;
    }
};

标签:code,TreeNode,cur,二叉,搜索,序列化,root,string
From: https://www.cnblogs.com/929code/p/17676767.html

相关文章

  • 京东搜索EE链路演进 | 京东云技术团队
    导读搜索系统中容易存在头部效应,中长尾的优质商品较难获得充分的展示机会,如何破除系统的马太效应,提升展示结果的丰富性与多样性,助力中长尾商品成长是电商平台搜索系统的一个重要课题。其中,搜索EE系统在保持排序结果基本稳定的基础上,通过将优质中长尾商品穿插至排序结果中将优质商品......
  • mysql中文全文搜索
    在MySQL5.7.6之前,全文索引只支持英文全文索引,不支持中文全文索引,需要利用分词器把中文段落预处理拆分成单词,然后存入数据库。从MySQL5.7.6开始,MySQL内置了ngram全文解析器,用来支持中文、日文、韩文分词。本文使用的MySQL版本是5.7.22,InnoDB数据库引擎。为什么要用全文索引呢?......
  • xunsearch 搜索时按字段索引词加权
    在使用Xunsearch进行搜索时,我们可以通过XSSearch::addWeight针对某个字段添加权重索引词。该字段是否包含这个词都不影响搜索匹配结果,但如果包含会参与计算结果权重,使结果的相关度更高。常用于针对某一类数据提升搜索结果排序位置。如搜索包含"杭州"的结果,并且提升subjec......
  • xunsearch 解决单字符、无意义字符被分词导致的搜索不准确问题
    Xunsearch配置好启动服务后,我们进行搜索会发现一些单字符如的、了、是、和等被分词,导致搜索结果中出现了与搜索目标不一致但包含这些字符的结果,如此会导致搜索结果不准确。对于这种问题Xunsearch提供了stopwords.txt配置文件解决这个问题,只需要将想过滤掉的字符一行一个添加......
  • leetcode226 翻转二叉树——简单
      #Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,right=None):#self.val=val#self.left=left#self.right=rightclassSolution:definvertTree(self,root):......
  • Java反序列化:CommonsCollections6调试分析
    JDK8u71大版本中AnnotationInvocationHandler.readObject被修改了,为了使得CC1能够利用,又造了一条CC6CC6解决的是CC1在高版本jdk上无法利用的问题这里搬一下web佬Boogipop的整理图:环境搭建JDK测试版本:JDK11基础知识1.CC1和CC6的恶意代码执行触发链再来捋顺一下这条恶......
  • 向量搜索技术:基于Elasticsearch/PostgreSQL/Redis扩展的向量搜索数据库或独立向量搜索
    理论基础与研究向量数据库用于非结构化文本、图片、音频、视频搜索、推荐,将他们转换为数字向量表示来进行相似性(ANN)搜索。存储和搜索高维向量是其特征之一,通常采用高级索引技术和算法如HNSW,Annoy,或Faiss来实现。不同于SQL数据库,向量数据库更像nosql,用户接受使用sdk/API......
  • C#中泛型集合List<T>反序列化问题及解决方法
    一、普通类型的反序列化程序集问题及处理方法在一些应用系统中常常有两个子系统软件A与B:A软件序列化一个数据文件,该文件将在B软件中使用。例如,在15年的交通运输部小样本调查数据的审核软件中,A软件就是笔者自己用的审核规则编制软件;B软件则是给用户使用的审核小样本调查数据的客户......
  • 折半搜索 学习笔记
    关于算法折半搜索,又称meetinthemiddle算法。顾名思义,就是将整个搜索的过程分成两个部分分别进行搜索,然后再将两个部分搜索出来的答案进行合并,得到最终的答案。dfs搜索算法一般都是指数级别的,那么我们假如每次dfs时都有两种决策,那么我们执行dfs算法的时间复杂度为\(O......
  • dubbo 支持的 9 种协议和对应序列化协议
    1、dubbo协议(默认)默认就是走dubbo协议的,单一长连接,NIO异步通信,基于hessian作为序列化协议2、rmi协议走java二进制序列化,多个短连接,适合消费者和提供者数量差不多,适用于文件的传输,一般较少用3、hessian协议走hessian序列化协议,多个短连接,适用于提供者数量比消费者数量还多,适用......