IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【05-11】力扣每日一题 -> 正文阅读

[数据结构与算法]【05-11】力扣每日一题

白羽发间插,流星腰后挂。

常怀报国志,何处不为家。
本文首发于馆主君晓的博客,05-11

题目内容

??题目链接449. 序列化和反序列化二叉搜索树,题目截图如下:

image-20220512110848186

题目分析

??这道题目比较贴近我们日常的应用,是关于序列化和反序列化的问题。题目的意思,简单来说就是,给你一个二叉搜索树,你需要将其序列化成字符串,并且序列化成字符串之后,从字符串能够反序列化成这个二叉搜索树的结构。

??想到这里,我想起以前做过的一道题目,给你前序遍历和中序遍历的结果或者给你后序遍历和中序遍历的结果,你来还原二叉树的结构。那么这里同样可以这样做,我们选用中序遍历+后序遍历的组合。因为二叉搜索树的中序遍历的结果就是从小到大的升序排序结果。所以对于序列化的方法,我们只需要将二叉树进行后序遍历,得到后序遍历的结果即可。然后对于反序列化,我们首先将后序遍历的结果排序(按照升序的方式排),那么不就得到了中序遍历的结果,之后结合原来的后续遍历即可实现二叉搜索树的构建。当然这个题目我们可以不用排序,直接根据二叉搜索树的特点直接写代码,看下面的代码就懂了。

??这里对于使用中序+后序构建二叉搜索树,这里简单说一下,我们使用栈的数据结构来帮助我们完成。我们知道中序遍历的方式是左根右,而后续遍历的方式是左右根,那么对于后序遍历而言其末尾就是我们的根节点。

代码实现

??c++代码实现如下:

class Codec {
public:
    string serialize(TreeNode* root) {
        string res;
        vector<int> arr;
        // 后序遍历 遍历结果放在数组arr里
        postOrder(root, arr);
        if (arr.size() == 0) {
            // 根节点为空 直接返回空字符串
            return res;
        }
        for (int i = 0; i < arr.size() - 1; i++) {
            // 每个结点的值使用逗号隔开
            res.append(to_string(arr[i]) + ",");
        }
        res.append(to_string(arr.back()));
        return res;
    }

    vector<string> split(const string &str, char dec) {
        int pos = 0;
        int start = 0;
        vector<string> res;
        // 分隔开每一个逗号
        while (pos < str.size()) {
            while (pos < str.size() && str[pos] == dec) {
                pos++;
            }
            // 非逗号起点
            start = pos;
            while (pos < str.size() && str[pos] != dec) {
                pos++;
            }
            // 此时的pos为逗号终点
            if (start < str.size()) {
                res.emplace_back(str.substr(start, pos - start));
            }
        }
        return res;
    }

    TreeNode* deserialize(string data) {
        if (data.size() == 0) {
            return nullptr;
        }
        vector<string> arr = split(data, ',');
        stack<int> st;
        // 栈放后序遍历的结果
        for (auto & str : arr) {
            st.emplace(stoi(str));
        }
        return construct(INT_MIN, INT_MAX, st);
    }

    void postOrder(TreeNode *root,vector<int> & arr) {
        if (root == nullptr) {
            // 结点为空指针 直接返回
            return;
        }
        // 先遍历左子树
        postOrder(root->left, arr);
        // 然后遍历右子树
        postOrder(root->right, arr);
        // 最后访问根节点
        arr.emplace_back(root->val);
    }

    TreeNode * construct(int lower, int upper, stack<int> & st) {
        if (st.size() == 0 || st.top() < lower || st.top() > upper) {
            // 当栈为空 或者 数据不符合要求 返回空指针
            return nullptr;
        }
        int val = st.top();
        st.pop();
        // 因为后序遍历是 左右根 所以从后往前 是 根右左
        TreeNode *root = new TreeNode(val);
        // 构建右子树 因为是二叉搜索树 所以 右子树最小值为 val
        root->right = construct(val, upper, st);
        // 构建左子树 因为是二叉搜索树
        root->left = construct(lower, val, st);
        return root;
    }
};

结语

??剑指的方向,就是天才的故乡。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-14 10:09:04  更:2022-05-14 10:09:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:48:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码