国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【LeetCode - 每日一題】449. 序列化和反序列化二叉搜索樹(23.09.04)

這篇具有很好參考價值的文章主要介紹了【LeetCode - 每日一題】449. 序列化和反序列化二叉搜索樹(23.09.04)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

449. 序列化和反序列化二叉搜索樹

題意

  • 給定一棵二叉搜索樹,實現(xiàn)序列化和反序列化;
  • 注意 val 范圍,因此 在序列化時需要插入分隔符分割每個節(jié)點的 val;
  • 要善于利用 二叉搜索樹的特性(中序遍歷 = 遞增排序);

解法

  • 前序遍歷 + 中序遍歷 可以重構(gòu)一棵樹,又由于二叉搜索樹自帶中序遍歷,因此在序列化時保存前序遍歷;
  • 由于節(jié)點的 val 不一定是個位數(shù),所以要在序列化時插入分隔符;
  • 在反序列化時,首先分割字符串,得到前序遍歷,然后通過前序遍歷和中序遍歷進行二叉搜索樹的重構(gòu)。
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Codec {
public:
    void PreOrder(TreeNode* root, string& data)
    {
        if(root == nullptr) return;

        data.append(to_string(root->val) + ","); 	// , 作為分隔符

        // if(root->left != nullptr) 	遞歸函數(shù)開頭就判斷了非空的情況,因此這里不需要再次判斷了
        PreOrder(root->left, data);
        // if(root->right != nullptr) 	遞歸函數(shù)開頭就判斷了非空的情況,因此這里不需要再次判斷了
        PreOrder(root->right, data);
    }

    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {
        string res = "";

        PreOrder(root, res);

        return res;
    }

    vector<int> Split(string data) 	// 將序列化后的 string 進行分割,得到每個節(jié)點的 val
    {
        int idx = 0;
        int curS = 0;
        vector<int> ans;

        while(idx < data.size())
        {
            if(data[idx] == ',')
            {
                string cur = data.substr(curS, idx - curS);
                ans.emplace_back(stoi(cur));
                curS = idx + 1;
            }
            idx++;
        }
        return ans;
    }
    TreeNode* ReconstructTree(vector<int> data, int s, int t)
    {
        TreeNode* root = new TreeNode(data[s]);
        int rightIdx = -1;

        // 沒有孩子
        if(s == t)
            return root;

        // 尋找右孩子的根
        for(int i = s + 1; i <= t; i++)
        {
            if(data[i] > root->val)
            {
                rightIdx = i;
                break;
            }
        }

        if(rightIdx == -1)  // 沒有右孩子
        {
            root->right = nullptr;

            // 構(gòu)建左孩子
            root->left = ReconstructTree(data, s + 1, t);
        }
        else if(rightIdx == s + 1)  // 沒有左孩子
        {
            root->left = nullptr;
            // 構(gòu)建右孩子
            root->right = ReconstructTree(data, s + 1, t);
        }
        else
        {
            // 有左孩子,構(gòu)建左孩子和右孩子
            root->left = ReconstructTree(data, s + 1, rightIdx - 1);
            root->right = ReconstructTree(data, rightIdx, t);
        }

        return root;
    }
    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        if(data == "") return nullptr;

        vector<int> intData = Split(data);

        TreeNode* root = ReconstructTree(intData, 0, intData.size()-1);

        return root;
    }
};

// Your Codec object will be instantiated and called as such:
// Codec* ser = new Codec();
// Codec* deser = new Codec();
// string tree = ser->serialize(root);
// TreeNode* ans = deser->deserialize(tree);
// return ans;

復雜度

時間復雜度:O(N),序列化前序遍歷每個節(jié)點,反序列化也是恢復每個節(jié)點;
空間復雜度:O(N),存儲序列化后的字符串。文章來源地址http://www.zghlxwxcb.cn/news/detail-694969.html


到了這里,關于【LeetCode - 每日一題】449. 序列化和反序列化二叉搜索樹(23.09.04)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Leetcode 297. 二叉樹的序列化與反序列化

    Leetcode 297. 二叉樹的序列化與反序列化

    297. 二叉樹的序列化與反序列化

    2024年02月07日
    瀏覽(26)
  • 【LeetCode力扣】297. 二叉樹的序列化與反序列化

    【LeetCode力扣】297. 二叉樹的序列化與反序列化

    ? 目錄 1、題目介紹 2、解題思路? 2.1、詳細過程圖解 2.2、代碼描述? ?2.3、完整代碼 ? 原題鏈接:297. 二叉樹的序列化與反序列化 - 力扣(LeetCode) ? 示例 1: 輸入: root = [1,2,3,null,null,4,5] 輸出: [1,2,3,null,null,4,5] 示例 2: 輸入: root = [ ] 輸出: [ ] 示例 3: 輸入: root = [1

    2024年02月08日
    瀏覽(32)
  • 什么是序列化和反序列化?

    JSON(JavaScript Object Notation)和XML(eXtensible Markup Language)是兩種常用的數(shù)據(jù)交換格式,用于在不同系統(tǒng)之間傳輸和存儲數(shù)據(jù)。 JSON是一種輕量級的數(shù)據(jù)交換格式,它使用易于理解的鍵值對的形式表示數(shù)據(jù)。JSON數(shù)據(jù)結(jié)構(gòu)簡單明了,易于讀寫和解析,是基于JavaScript的一種常用數(shù)據(jù)

    2024年02月09日
    瀏覽(29)
  • Unity-序列化和反序列化

    序列化是指把對象轉(zhuǎn)換為字節(jié)序列的過程,而反序列化是指把字節(jié)序列恢復為對象的過程。序列化最主要的用途就是傳遞對象和保存對象。 在Unity中保存和加載、prefab、scene、Inspector窗口、實例化預制體等都使用了序列化與反序列化。 1 自定義的具有Serializable特性的非抽象、

    2024年01月24日
    瀏覽(27)
  • 【Linux】序列化和反序列化

    【Linux】序列化和反序列化

    在網(wǎng)絡編程中,直接使用 結(jié)構(gòu)體 進行數(shù)據(jù)傳輸會出錯,因為 本質(zhì)上socket無法傳輸結(jié)構(gòu)體 ,我們只有將結(jié)構(gòu)體裝換為字節(jié)數(shù)組,或者是字符串格式來傳輸,然后對端主機收到了數(shù)據(jù),再將其轉(zhuǎn)化為結(jié)構(gòu)體,這就是序列化和反序列化的過程! 序列化 (Serialization)是將對象的狀態(tài)

    2024年02月10日
    瀏覽(19)
  • Java序列化和反序列化

    目錄 一、序列化和反序列化 二、Java序列化演示 三、反序列化漏洞 1、含義 ?序列化就是內(nèi)存中的對象寫入到IO流中,保存的格式可以是二進制或者文本內(nèi)容。反序列化就是IO流還原成對象。 2、用途 (1)傳輸網(wǎng)絡對象 (2)保存Session 1、序列化 java.io.ObjectOutputStream代表對象

    2023年04月25日
    瀏覽(27)
  • Java序列化和反序列化機制

    在閱讀 ArrayList 源碼的時候,注意到,其內(nèi)部的成員變量動態(tài)數(shù)組 elementData 被Java中的 transient 修飾 transient 意味著Java在序列化時會跳過該字段(不序列化該字段) 而Java在默認情況下會序列化類(實現(xiàn)了 Java.io.Serializable 接口的類)的所有非瞬態(tài)(未被 transient 修飾

    2024年03月15日
    瀏覽(27)
  • jackjson自定義序列化和反序列化

    jackjson自定義序列化和反序列化

    JRT引用的jackjson作為json處理庫。由于JRT.ORM要求表不用datetime類型,把日期和時間用Int存儲,所以ORM要支持日期時間的轉(zhuǎn)換。為什么要把日期時間不用datetime而用Int,比如日期:20240117,時間就是從0點到當前的秒數(shù)。因為不用datetime兼容性好,不會因為不同庫datetime函數(shù)不同而要

    2024年01月18日
    瀏覽(21)
  • TCP定制協(xié)議,序列化和反序列化

    TCP定制協(xié)議,序列化和反序列化

    目錄 前言 1.理解協(xié)議 2.網(wǎng)絡版本計算器 2.1設計思路 2.2接口設計 2.3代碼實現(xiàn): 2.4編譯測試 總結(jié) ? ? ? ? 在之前的文章中,我們說TCP是面向字節(jié)流的,但是可能對于面向字節(jié)流這個概念,其實并不理解的,今天我們要介紹的是如何理解TCP是面向字節(jié)流的,通過編碼的方式,自

    2024年02月12日
    瀏覽(23)
  • java中的序列化和反序列化

    objectOutputStream 對象的序列化,以流的形式將對象寫入文件 構(gòu)造方法: objectOutputStream(OutputStream out) 傳入一個字節(jié)輸入流創(chuàng)建objectOutputStream對象 成員方法: void writeObject(object obj) 將指定的對象寫入objectOutputStream 使用步驟: 創(chuàng)建一個類,這個類實現(xiàn)Serializable接口,Serializable是一

    2024年02月14日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包