LeetCode99. 恢复二叉搜索树:morris遍历100%+99%(17张图超详细的解析!!!!)

利用两种遍历结果恢复二叉树并打印 含有源代码和实验报告。简单人机交互选择要输入的遍历结果,然后利用输入的遍历结果恢复二叉树,并按照缩进式打印二叉树。 立即下载

https://leetcode-cn.com/problems/recover-binary-search-tree/

题意

给你二叉搜索树的根节点 root ,该树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。

进阶:使用 O(n) 空间复杂度的解法很容易实现。你能想出一个只使用常数空间的解决方案吗?
。

输入:root = [1,3,null,null,2]
输出:[3,1,null,null,2]
解释:3 不能是 1 左孩子,因为 3 > 1 。交换 1 和 3 使二叉搜索树有效。

在这里插入图片描述

输入:root = [3,1,4,null,null,2]
输出:[2,1,4,null,null,3]
解释:2 不能在 3 的右子树中,因为 2 < 3 。交换 2 和 3 使二叉搜索树有效。

题解

这道题目的意思是,一颗二叉搜索树中两个节点的位置被调换了,要我们把他恢复原状。想来也简单,找到被调换的两个节点,将他们的元素值调换一下就解决了,但问题是,题目觉得O(n)的空间复杂度太简单了(把所有元素值找到用数组存起来,就能找到被调换的元素),非要整个O(1)的空间复杂度,所以就麻烦起来了了。那先不管,先看看怎么找被调换的元素。
大家都知道,二叉搜索树的中序遍历是升序,假设一棵二叉搜索树的中序遍历如下所示。
在这里插入图片描述

中序遍历顺序:1 2 3 4 5 6 7

此时我们交换1和4的位置。
在这里插入图片描述

此时中序遍历的结果:4 2 3 1 5 6 7

显然,在中序遍历中1和4的位置交换了。且中序遍历的结果中出现了两个逆序(大的在前,小的在后)
在这里插入图片描述
而两个交换元素显然就是第一个逆序的首个元素4(大的元素交换到前面,一定是第一个逆序的首个元素)和第二个逆序的末位元素1。
所以我们只要根据中序遍历顺序寻找其中的逆序就可以了。当然,还需注意一种情况也就是中序遍历序列中相邻元素的交换,比如,我们将元素2和3交换。

在这里插入图片描述

中序遍历的结果为:1 3 2 4 5 6 7

在这里插入图片描述

此时两个逆序合并成了一个,且交换元素就是逆序中的两个元素。
所以对于一个被交换过后的二叉搜索树,我们不得不遍历完所有的节点(当只找到一个逆序时),或者在找到两个逆序后结束遍历。

方法一:常规中序遍历,只记录逆转元素

该方法使用两个指针指向逆转元素,通过递归的中序遍历寻找逆序,看似完成了O(1)空间复杂度的要求,实际上,不管是使用迭代方法或者递归方法进行中序遍历,都需要O(h)的空间复杂度,因为中序遍历的时候栈的深度取决于二叉搜索树的高度,所以该方法其实并没有满足O(1)空间复杂度的要求。

//常规中序遍历解法,空间复杂度为O(h),h为树的高,中序遍历的时候栈的深度取决于二叉搜索树的高度。
class Solution {
    TreeNode reverOne=null,reverTwo=null;
    TreeNode pre=null;
    int times=0;//记录找到的逆序次数
    public void recoverTree(TreeNode root) {
        if(root==null)return;
        inorderTraversal(root);
        int tmp=reverOne.val;
        reverOne.val=reverTwo.val;
        reverTwo.val=tmp;
    }

    private void inorderTraversal(TreeNode root){
        if(root==null||times==2)return ;//最多2个逆序
        inorderTraversal(root.left);
        if(pre!=null&&pre.val>root.val){//被替换的后节点
            times++;
            if(null==reverOne)
                reverOne=pre;//记录第一个节点
            if(null!=reverOne)
                reverTwo=root;
        }
        pre=root;//跟新前节点
        inorderTraversal(root.right);
    }
}

在这里插入图片描述

方法二:morris遍历,真正实现O(1)空间复杂度

在递归或者迭代实现的中序遍历中,为什么需要O(h)的空间复杂度?这是因为一些父类节点到达后并不能直接访问,而要等左子树中元素访问后才能进行访问,所以需要将父节点通过栈存储起来(所以有左子树的节点到达后才需要存储起来之后访问),在恰当的时机再进行访问。那么什么才是恰当的时机?以中序遍历为例,当然是左子树访问完的时候。那左子树什么访问完?当然是父节点的前驱节点访问完的时候。既然一个父节点有左子树,那么他的前驱节点一定是左子树中,最右侧的元素(左子树中最大的元素),如下图中10的前驱节点就是8。

在这里插入图片描述
而前驱节点8是10左子树中最右侧的元素,所以一定没有右子节,既然在访问完8之后需要回到10访问,我们干脆利用8空闲的右节点,让它指向10,这样我们就不需要存储10到栈中,直接通过8就可以回到10,如下图所示。

在这里插入图片描述
对于有左子树的节点2和17也是同理,让他们前驱节点的右节点指向他们,如下图所示。

在这里插入图片描述
下面我们可以模拟一下流程,看看到底是怎么回事。

1.先到达根节点10,用一个指针cur(current简写)指向,发现有左子树所以不能立刻访问,所以需要先让它的前驱节点的右节点指向它,以便下次访问,所以从它的左节点开始不断向右找到后继节点8,让8的右节点指向它,这样10的任务就暂时完成了,也不再需要他了,所以进入它的左节点开始访问,即cur=cur.left。这是的结果如图所示,橙色代表当前到达的节点。

在这里插入图片描述

2.此时到达节点2,发现还是有左节点,所以故技重施,让2的前驱节点的右节点指向它,然后进入左子树。

在这里插入图片描述

3.此时进入1后发现没有左子树,所以终于可以安心地访问了(在此将访问过的节点标为灰色),然后再进入右节点,此时也就是节点2。

在这里插入图片描述

4.此时进入2,发现还有左节点,那我怎么知道它的左边有没有访问过呢,只能进入左子树找到前驱节点,看看前驱节点心里有没有他,结果找到前驱节点1后发现节点1的右节点就是它,于是节点2这才放了心,安心地按照中序遍历的顺序,访问自己,然后去往右子树,当然不要忘了修改前驱节点的右节点为空,也就是将回来的线索擦掉,否则二叉树有环LeetCode可不开心了。

在这里插入图片描述

5.进入了6后发现6没有左子树,这可把它开心坏了,终于可以把自己放在第一位了(唉,男人啊,有时候就是得对自己好点),于是乖乖访问自己,然后去往右子树。

在这里插入图片描述

6.进入节点8后,还是保持着乐观的心情,没有左子树,自己还是第一位,又乖乖访问自身,然后去往右节点。

在这里插入图片描述

7.到了节点10,发现有左子树,这心情又直转极下,不过还是故技重施,进入左子树的最右侧,找到前驱节点,发现这死鬼心里还是有他的,便消除线索,访问自身,进入右子树。

在这里插入图片描述

8.到达17,发现有左子树…,这说得俺都有点倦了,不过还是同样的套路,找到前驱节点13,设置线索,然后进入左子树。

在这里插入图片描述

9.到达节点13,没有左子树,访问自身,然后去往右节点。

在这里插入图片描述

10.到达节点17,找到前驱节点13,发现13指向着他,说明左子树访问过了,于是消除线索,访问自身,去往右节点。

在这里插入图片描述

11.到达节点20,发现没有左子树,于是访问自身,然后去往右节点。

在这里插入图片描述

此时节点cur为空,循环也就结束了,节点也已经访问完毕,终于可以上代码了。

morris遍历代码

这里用的节点是自定义的Node< E >,而非题目中的TreeNode。

private void morrisTraversal(Node<E> root){
    if(root==null)return;
    Node<E> cur=root,pre=null;//pre为前驱节点
    while(cur!=null){
        if(cur.left==null){//当没有左节点
            System.out.print(cur.element+" ");//直接访问当前节点
            cur=cur.right;//去往右节点
        }else{//有左节点,则需要先访问左节,并预先设置好回到当前节点的方法
            pre=cur.left;
            //寻找前驱节点
            while(null!=pre.right&&cur!=pre.right){//注意cur!=pre.right不能省略,否则将进入cur的右子树
                pre=pre.right;
            }
            //此时找到的是后继节点(判断是否设置右节点为当前访问节点)
            if(cur!=pre.right){//如果没有完成设置
                //System.out.println("set "+pre.element+" to "+cur.element);//打印线索的设置
                pre.right=cur;//设置前驱节点的右节点指向当前节点
                cur=cur.left;//当前的节点已经不再需要,直接去往左节点
            }else{//否则表明是从左边回来,左边不用再访问
                pre.right=null;//清空线索
                System.out.print(cur.element+" ");//访问自身
                cur=cur.right;//去往右子树
            }
        }
    }
}

99. 恢复二叉搜索树代码

由于使用morris遍历导致二叉树在未遍历完的过程中成环,所以不能在找到2次逆序直接退出,因为遍历没有完成,还会有线索没有清除完,二叉树可能仍然有环。

//morris遍历解法,空间复杂度为O(1)
class Solution {
	//用于记录错位的第一个、第二个节点
    TreeNode reverOne=null,reverTwo=null;
    TreeNode previous=null;//记录上一个节点
    public void recoverTree(TreeNode root) {
        //使用morris遍历
        morrisTraversal(root);
        //交换
        swap(reverOne,reverTwo);
    }

    //morris遍历
    private void morrisTraversal(TreeNode root) {
        TreeNode cur = root, pre = null;
        while (cur != null) {
            if (cur.left == null) {//当没有左节点
                process(cur);//处理当前节点
                cur = cur.right;//去往右节点
            } else {//有左节点,则需要先访问左节,并预先设置好回到当前节点的方法
                pre = cur.left;
                //寻找前驱节点
                //注意cur!=pre.right不能省略,否则将进入cur的右子树
                while (null != pre.right && cur != pre.right)
                    pre = pre.right;
                //此时找到的是后继节点(判断是否设置右节点为当前访问节点)
                if (cur != pre.right) {//如果没有完成设置
                    //System.out.println("set "+pre.element+" to "+cur.element);//打印线索的设置
                    pre.right = cur;//设置前驱节点的右节点指向当前节点
                    cur = cur.left;//当前的节点已经不再需要,直接去往左节点
                } else {//否则表明是从左边回来,左边不用再访问
                    pre.right = null;//清空线索
                    process(cur);//处理当前节点
                    cur = cur.right;//去往右子树
                }
            }
        }
    }
    //记录错位节点
    private void process(TreeNode cur){
        if(previous!=null&&previous.val>cur.val){
            if(reverOne==null)reverOne=previous;
            reverTwo=cur;
        }
        previous=cur;//更新前节点
    }
    //交换节点
    private void swap(TreeNode node1,TreeNode node2){
        int tmp=node1.val;
        node1.val=node2.val;
        node2.val=tmp;
    }
}

在这里插入图片描述

英飞凌 TC4X MCAL之SPI中断与DMA高效传输实战 本文详细介绍了英飞凌TC4X芯片的SPI通信实战,重点讲解如何通过MCAL配置SPI中断与DMA实现高效数据传输。针对汽车电子领域的高吞吐需求,提供了从基础配置到中断处理、DMA优化的完整解决方案,包含代码示例和调试技巧,帮助开发者提升系统性能与CPU利用率。 阅读详情

相关推荐

使用pytorch构建LSTM_AE模型的两种方式

2.基本LSTM_Unit计算——基本LSTM_AE结构 3.自定义LSTM_Unit计算——自定义LSTM_AE结构 1.LSTM-Encoder-Decoder模型结构及简要解析 图基本lstm计算单元

qq_37840762的博客 7273

【Leetcode】99.恢复二叉搜索树——三种解法

99.恢复二叉搜索树题目描述解题思路解法1:显示中序遍历解法2:代码展示 题目描述 给定二叉搜索树的根节点root,该树种的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。 示例1 输入:root = [1,3,null,null,2] 输出:[3,1,null,null,2] 解释:3 不能是 1 左孩子,因为 3 > 1 。交换 1 和 3 使二叉搜索树有效。 示例2 输入:root = [3,1,4,null,null,2] 输出:[2,1,4,null,null,3] 解释:

小哲的博客 1496

最新Docker GPU支持全解析:为什么nvidia-smi能用但PyTorch找不到CUDA?

本文深入解析了Docker容器中nvidia-smi命令可用但PyTorch无法调用CUDA的根本原因。关键在于默认配置仅暴露了GPU的utility管理能力,而CUDA计算所需的compute能力未被激活。通过正确设置NVIDIA_DRIVER_CAPABILITIES环境变量为compute,utility,并配合--gpus参数,即可解决此问题,确保AI训练等任务顺利进行。

convnet3designer的博客 236

【leetcode热题100】恢复二叉搜索树

给你二叉搜索树的根节点root,该树中的两个节点的值被错误地交换。请在不改变其结构的情况下,恢复这棵树。3 不能是 1 的左孩子,因为 3 > 1。交换 1 和 3 使二叉搜索树有效。2 不能在 3 的右子树中,因为 2 < 3。交换 2 和 3 使二叉搜索树有效。

kiugvui的博客 1048

“双系统”出炉!瑞芯微RK3562J非对称AMP:Linux+RTOS/裸机

执行如下命令运行Linux应用程序rpmsg_echo,发送8个rpmsg数据包至运行Baremetal程序的Cortex-M0核心,当Cortex-M0核心每收到1个rpmsg数据包就会将数据包发送回Linux端。开发者可灵活分配任务或指定核心间通信,从而增强系统稳定性,减少崩溃风险,保障数据完整。下文以Cortex-A53(CPU0、CPU1、CPU2、CPU3)核心运行Linux系统与rpmsg_echo应用程序,Cortex-M0(MCU)核心运行Baremetal程序为例进行演示。

创龙,嵌入式一体化解决方案商 467

【BUG已解决】RuntimeError: CUDA error: no kernel image is available for execution on the device 解决方案

方案适用场景推荐指数精确匹配官方版本绝大多数场景(大众消费卡+主流数据中心卡)⭐⭐⭐⭐⭐安装历史旧版本Pascal/Maxwell等老显卡⭐⭐⭐⭐安装Nightly版本刚发布的最新架构显卡⭐⭐⭐⭐源码编译官方各版本均不支持的特殊硬件⭐⭐Docker官方镜像追求省心、避免版本排查⭐⭐⭐⭐⭐的核心是PyTorch 预编译包不包含你显卡对应的计算能力架构先确认显卡真实计算能力),而不是盲目重装驱动对比 PyTorch 支持的架构列表),定位是否真的不匹配精确匹配官方版本。

博客 1万+

LeetCode第99题----恢复二叉搜索树

今天分享LeetCode第99题:恢复二叉搜索树 文章目录前言一、题目描述二、思想和方法详述1.解题思想2.解题步骤详述总结 前言 本文将用图文并用的方式来较详细的阐述LeetCode第99题的解题过程和思路。 本人才疏学浅,如有错误请多担待并联系本人,感谢各位给本人一个学习的机会。 一、题目描述 给你二叉搜索树的根节点 root ,该树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。 示例: 二、思想和方法详述 1.解题思想 解题之前先谈何为搜索二叉树,简单地说,搜索二叉树就是根

F & F的博客 1208

『Apisix进阶(九)』基于Upstream实现服务转发的最佳实践

本篇文章将以服务转发为核心,带你从原理到实战,深入了解 Upstream 的配置方法与常用场景。

老陈聊架构 1508

99. 恢复二叉搜索树

给你二叉搜索树的根节点 root ,该树中的 恰好 两个节点的值被错误地交换。请在不改变其结构的情况下,恢复这棵树。解释:2 不能在 3 的右子树中,因为 2 < 3。交换 2 和 3 使二叉搜索树有效。解释:3 不能是 1 的左孩子,因为 3 > 1。交换 1 和 3 使二叉搜索树有效。输入:root = [3,1,4,null,null,2]输入:root = [1,3,null,null,2]输出:[2,1,4,null,null,3]输出:[3,1,null,null,2]

Winn~ 301

【云原生之Docker实战】使用docker部署Monica个人开源CRM系统

【云原生之Docker实战】使用docker部署Monica个人开源CRM系统

jks212454的博客 2381

玩转Docker | 使用Docker部署MediaCMS内容管理系统

玩转Docker | 使用Docker部署MediaCMS内容管理系统

qq_59334230的博客 2916

LeetCode 99 恢复二叉搜索树

给你二叉搜索树的根节点 root ,该树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。 进阶:使用 O(n) 空间复杂度的解法很容易实现。你能想出一个只使用常数空间的解决方案吗? 示例 1: 输入:root = [1,3,null,null,2] 输出:[3,1,null,null,2] 解释:3 不能是 1 左孩子,因为 3 > 1 。交换 1 和 3 使二叉搜索树有效。 示例 2: 输入:root = [3,1,4,null,null,2] 输出:[2,..

麦格芬230的博客 401

专栏二十:如何选择你的单细胞亚群的分辨率--ROGUE

ROGUE这是继chooseR后第二个计算单细胞亚群分辨率的内容,其实关于代码的运行很简单,网上已经有不少教程,重复这些就没意思了,这里主要是结合探讨一下这个算法。

m0_58549466的博客 981

恢复二叉搜索树

题目描述 给你二叉搜索树的根节点 root ,该树中的 恰好 两个节点的值被错误地交换。请在不改变其结构的情况下,恢复这棵树 。 示例: 输入:root = [1,3,null,null,2] 输出:[3,1,null,null,2] 解释:3 不能是 1 的左孩子,因为 3 > 1 。交换 1 和 3 使二叉搜索树有效。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/recover-binary-search-tree 著作权归领扣

m0_52238102的博客 540

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【9.3】树结构-恢复二叉搜索树

给你二叉搜索树的根节点root,该树中的两个节点的值被错误地交换。请在不改变其结构的情况下,恢复这棵树。3 不能是 1 的左孩子,因为 3 > 1。交换 1 和 3 使二叉搜索树有效。2 不能在 3 的右子树中,因为 2 < 3。交换 2 和 3 使二叉搜索树有效。[2, 1000]使用O(n)空间复杂度的解法很容易实现。你能想出一个只使用O(1)空间的解决方案吗?

攻城狮7号的博客 621

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

LeetCode【0099】恢复二叉搜索树

题目难度:中等;数据结构:二叉搜索树;应用算法:Morris遍历算法

AnFany 1087

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【力扣算法题】二叉树的中序遍历(莫里斯解法,菜鸡的理解 C++)

力扣算法题之二叉树的中序遍历,非迭代解法中的莫里斯解法

DALEKSERROR的博客 486

力扣每日一题99:恢复二叉搜索树

给你二叉搜索树的根节点root,该树中的两个节点的值被错误地交换。请在不改变其结构的情况下,恢复这棵树。3 不能是 1 的左孩子,因为 3 > 1。交换 1 和 3 使二叉搜索树有效。2 不能在 3 的右子树中,因为 2 < 3。交换 2 和 3 使二叉搜索树有效。[2, 1000]使用O(n)空间复杂度的解法很容易实现。你能想出一个只使用O(1)空间的解决方案吗?通过次数146.4K提交次数242.3K通过率60.5%

m0_73441691的博客 624

leetcode--恢复二叉搜索树

给你二叉搜索树的根节点 root ,该树中的 恰好 两个节点的值被错误地交换。请在不改变其结构的情况下,恢复这棵树。示例 1:输入:root = [1,3,null,null,2]输出:[3,1,null,null,2]解释:3 不能是 1 的左孩子,因为 3 > 1。交换 1 和 3 使二叉搜索树有效。示例 2:输入:root = [3,1,4,null,null,2]输出:[2,1,4,null,null,3]解释:2 不能在 3 的右子树中,因为 2 < 3。

liulanba的博客 749

【LeetCode】恢复二叉搜索树

利用中序遍历升序的特性找到逆序对,恢复逆序对后重新构造树。

牛油果绿🥑的博客 283

pair~~

//pair相当于结构体头文件是:#include<utility> pair<T1, T2> p1; //创建一个空的pair对象(使用默认构造),它的两个元素分别是T1和T2类型,采用值初始化。 pair<T1, T2> p1(v1, v2); //创建一个pair对象,它的两个元素分别是T1和T2类型,其中first成员初始化为v1,second成员初始化为v2。 p1=make_pair(v1, v2); ..

weixin_51404432的博客 617

【LeetCode】Morris解法求二叉树的前中后序遍历(带图解)

Morris的整体思路就是将,以某个根节点开始,找到它左子树的最右侧结点之后与当前根节点进行连接,连接之后cur指针可以完整地顺着节点遍历完整个子树,直至为空。

m0_57248981的博客 456

整理:Java二叉树遍历(递归、迭代、Morris)原创图解+代码

刷题的时候看到一些二叉树遍历的解法,整理在这里作为笔记,也分享给大家。语言是 Java 的,我会采取代码+图解+说明形式来尽可能讲明白每种遍历方式。

qq_64257622的博客 2140

算法基础17-《进阶》Morris遍历

文章目录1 Morris遍历1.1 Morris遍历目的算法流程时间复杂度估计1.2 Morris遍历的应用1.3 Morris遍历为最优解的情景 1 Morris遍历 1.1 Morris遍历目的 在二叉树的遍历中,有递归方式遍历和非递归遍历两种。不管哪种方式,时间复杂度为O(N),空间复杂度为O(h),h为树的高度。Morris遍历可以在时间复杂度O(N),空间复杂度O(1)实现二叉树的遍历 算法流程 从一个树的头结点cur开始: 1、cur的左树为null,cur = cur.right 2、cur有

weixin_42503072的博客 275

彻底理解被称为二叉树神级遍历的莫里斯(Morris)算法

二叉树的遍历我们已经介绍过了最常见的递归遍历:用Java描述数据结构之二叉树,前序遍历,中序遍历,后序遍历 和迭代遍历二叉树前序,中序,后序遍历的迭代实现,实现思路及代码 上面两种遍历虽然看上去不同,但是底层的思路是大同小异的,都是调用栈,递归是用java虚拟机栈,而迭代使用我们自己创建的栈。今天要介绍的莫里斯算法,它的背后没有用任何栈相关的知识,而且相比于前两种空间复杂度为O(n)(因为进栈最差会所有数据全部进栈)的遍历来说,莫里斯算法的空间复杂度只有O(1),这对于量很大的数据来说无疑是天上地下的区别。

qq_46209845的博客 7198

leetcode 99. 恢复二叉搜索树

解题方法汇总如下1.递归法递归法的第二种写法:递归法的第三种写法2.数组法3.mirror遍历 1.递归法 思路: 中序遍历BST,依次访问的节点值是递增的,错误的BST会破坏递增性,从而能定位出错误。 我发现,错误有两种: 错误1:出现了两对不满足前小后大,需要交换第一对的第一个元素与第二对的第二个元素。 错误2:只出现一对不满足前小后大,交换这一对元素即可。 比较前后访问的节点值,prev 保存上一个访问的节点,当前访问的是 root 节点。 每访问一个节点,如果prev.val>=ro...

m0_53157173的博客 691
上一篇: LeetCode173. 二叉搜索树迭代器(超实用的解法!!!!)
下一篇: LeetCode203. 移除链表元素:常规迭代+头节点+递归(100%+90% 超详细的解法!!!!)
von Libniz
博客等级 码龄8年 421粉丝 173原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值