当前位置: 首页 > web >正文

代码随想录刷题Day47

将有序数组转换为二叉搜索树

这道题目,看到返回值是构建好的平衡二叉搜索树的指针,很容易可以联想到使用递归的方法。

使用递归方法的关键是,左右子树的递归调用以及对当前根节点的处理。

这道题,

        二叉搜索树的特征是左子树节点 < 根节点 < 右子树节点 ,由于序列是升序的,这个特征自然是可以保证的;

        平衡二叉树,要求是左右子树的层数之差不能超过1,为了保证这个条件,可以让序列的中间位置的值作为根节点,这样左右子树就数量大致一样(不一样,也是相差1个节点)。

由此可以给出代码:

class Solution {
public:TreeNode* HelpBuildToBST(vector<int> nums,int left,int right){if(left > right) return nullptr;else if(right == left){return new TreeNode(nums[left]);}else{//中间节点为根节点,左右两子树分别是序列的左右两端int mid = (right + left)/2;return new TreeNode(nums[mid],HelpBuildToBST(nums,left,mid-1),HelpBuildToBST(nums,mid+1,right));}}TreeNode* sortedArrayToBST(vector<int>& nums) {int len = nums.size();return HelpBuildToBST(nums,0,len-1); }
};

把二叉搜索树转换为累加树

关于这道题目的累加概念的理解,如上图我的标记,处理的顺序是按照右-中-左的遍历顺序来执行的,本质考察的是二叉搜索树的中序遍历,只不过不是左中右,而是右中左了。代码也是中序遍历的代码。我尝试使用递归和迭代的方法做这道题:

迭代法(时间领先100%,内存消耗领先41.25%):

public:
int sum = 0;TreeNode* convertBST(TreeNode* root) {if(!root) return root;else{stack<TreeNode*> stackTree;stackTree.push(root);TreeNode* cur;cur = root;while(!stackTree.empty()){if(cur != nullptr){cur = cur->right;if(cur) stackTree.push(cur);}else{cur = stackTree.top();stackTree.pop();sum += cur->val;cur->val = sum;cur = cur->left;if(cur) stackTree.push(cur);}}return root;}}
};

递归法(时间消耗领先100%,内存消耗领先73.89%):

class Solution {
public:
int sum = 0;TreeNode* convertBST(TreeNode* root) {if(root==nullptr) return nullptr;else{if(root->right) root->right = convertBST(root->right);sum+= root->val;root->val = sum;if(root->left) root->left = convertBST(root->left);return root;}}
};

这次做的两道题,虽然都和搜索二叉树有关,但核心代码部分,其实没有太大关系。第一个题目主要是平衡二叉树的构建要从中位数开始构建,第二个题目是考察二叉树的中序遍历。

http://www.xdnf.cn/news/19624.html

相关文章:

  • 前端测试深度实践:从单元测试到E2E测试的完整测试解决方案
  • 医疗AI时代的生物医学Go编程:高性能计算与精准医疗的案例分析(八)
  • 华宇TAS应用中间件与长城科技两款产品完成兼容互认证
  • 卷积神经网络训练全攻略:从理论到实战
  • 矩阵中寻找好子矩阵
  • 解决爬虫IP限制:Selenium隧道代理完整解决方案
  • 【git】解决Failed to connect to github.com port 443: Timed out
  • 如何修复Lyra Starter Game的按键绑定功能?
  • 智能运维新范式:自动化如何提升企业IT效率
  • 二叉树OJ习题
  • Azure AI Search构建RAG的优化点
  • 动态配置最佳实践:Spring Boot 十种落地方式与回滚审计指南(含实操与避坑)
  • Hello World背后的秘密:详解 C++ 编译链接模型
  • 【重学MySQL】九十三、MySQL字符集与比较规则完全解析
  • Python轻量化革命:用MicroPython构建边缘智能设备
  • 【开题答辩全过程】以 基于SpringBoot的流浪猫狗领养系统为例,包含答辩的问题和答案
  • Unity学习----【数据持久化】二进制存储(二)--文件流
  • 大模型RAG项目实战:Milvus向量数据库
  • 实现自己的AI视频监控系统-第三章-信息的推送与共享1
  • Bootloader(1):初步认识Bootloader概念(什么是Bootloader)
  • 基于muduo库的图床云共享存储项目(三)
  • Ansible配置文件与主机清单
  • juicefs+ceph rgw 存储安装
  • MYSQL表的增删改查
  • 深入解析数据结构之单链表
  • ros2bag_py的api小结、丢帧问题对策
  • 【Linux基础】Linux系统启动:深入理解GRUB引导程序
  • 平面椭圆转化为三阶Bezier曲线的方法
  • 并发编程——10 CyclicBarrier的源码分析
  • 大模型参数到底是什么?