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

代码随想录刷题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.dtcms.com/a/361455.html

相关文章:

  • 深度学习篇---ShuffleNet网络结构
  • NextJs基础
  • 《LINUX系统编程》笔记p7
  • 1.数值分析——概述、误差
  • 【数据可视化-105】Pyecharts主题组件:让你的图表瞬间高大上
  • c++关键字
  • 首屏优化讲解
  • JavaEE 进阶第一期:开启前端入门之旅(上)
  • pip不是内部或外部命令的问题怎么解决?
  • 【数据库】Sql Server数据库中isnull、iif、case when三种方式的使用和空值判断
  • docker本地部署dify,nginx80端口占用的报错
  • Spring Ioc —— 集合类型的依赖注入
  • js语言编写科技风格博客网站-详细源码
  • LINUX驱动篇(二)驱动开发
  • 埃文科技荣获2025年“数据要素×”大赛河南分赛二等奖
  • FPGA时序约束(二)--做时序约束,本质上是在干嘛
  • 新闻资讯|基于微信小程序的经济新闻资讯系统设计与实现(源码+数据库+文档)
  • ARM-进阶汇编指令
  • 基于AI与物联网的中央空调节能调控系统
  • 原子操作(Atomic Operation) 是指不可被中断的操作——要么完整执行,要么完全不执行
  • Android修改进程优先级
  • 在IDEA里使用Google Java Format
  • UART控制器——ZYNQ学习笔记14
  • 解决Content Security Policy (CSP)问题
  • Sparse4Dv3 部署到 TensorRT-(1)
  • Gradle vs. Maven,Java 构建工具该用哪个?
  • Paimon MergeTreeWrite、Compaction 和 快照构建
  • 嵌入式解谜日志之Linux操作系统—进程间的通信(IPC):无名管道,有名管道,信号通信5
  • 单片机元件学习
  • 【stm32】定时器(超详细)