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

【代码随想录day 20】 力扣 538.把二叉搜索树转换为累加树

视频讲解:https://www.bilibili.com/video/BV1d44y1f7wP/?share_source=copy_web&vd_source=a935eaede74a204ec74fd041b917810c
文档讲解:https://programmercarl.com/0538.%E6%8A%8A%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E8%BD%AC%E6%8D%A2%E4%B8%BA%E7%B4%AF%E5%8A%A0%E6%A0%91.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE
力扣题目:https://leetcode.cn/problems/convert-bst-to-greater-tree/

这道题可以使用双指针法,主要思路如下:

  1. pre负责记录节点的值,初始值为0,cur负责遍历节点
  2. 因为是从大往小遍历,所以我们采用右中左的遍历方式
  3. 中间记录的时候cur的val与pre相加,并更新在当前节点上,pre更新到cur的值,cur再回溯到上一层
    要注意,pre一定要跟上cur。
class Solution {
public:int pre=0;void traversal(TreeNode *cur){//终止条件if(cur == NULL) return ;//开始递归 从大到小遍历  右convertBST(cur->right);//中cur->val += pre;pre = cur->val;//左convertBST(cur->left);return;}TreeNode* convertBST(TreeNode* root) {traversal(root);return root;}
};

迭代法也可以解决这道题,利用栈的先进后出特性,主要思路如下:
4. 首先从根节点往右子树走,一直到根节点,沿途的节点入栈。
5. 如果cur不为空或者栈不为空就持续循环,当节点不为空时,压入栈同时节点往右走;当节点为空时,取栈顶元素,与pre相加更新当前节点,再往左子树走,如果左子树存在就跳转到上一个判断条件压入栈

class Solution {
public://记录前一个节点的数值int pre = 0;void traversal(TreeNode *root){stack<TreeNode *> st;TreeNode *cur = root;//当cur不为空或栈不为空就执行循环while(cur != NULL || !st.empty()){   //如果cur不为空就入栈,可以用于判断是否有左子树if(cur !=NULL){st.push(cur);cur = cur->right;}else{//取栈顶元素cur=st.top();//弹出栈顶st.pop();//更新cur,pre跟上curcur->val += pre;pre=cur->val;//去找cur的左子树,如果有左子树,下次循环会存入栈中,如果没有,直接下一个栈顶元素cur=cur->left;}}}TreeNode* convertBST(TreeNode* root) {traversal(root);return root;}

总体来说有点绕,可以参考下面这个流程:

# BST 转换为累加树(Greater Tree)执行过程## 初始 BST4/ \
1   6/ \5   7---## 初始状态
- `pre = 0`
- `cur = root (4)`
- 栈:`[]`---## 1️⃣ 第一次 while 循环
- `cur = 4` → 入栈  栈:`[4]`  `cur = 6`---## 2️⃣ 第二次 while 循环
- `cur = 6` → 入栈  栈:`[4, 6]`  `cur = 7`---## 3️⃣ 第三次 while 循环
- `cur = 7` → 入栈  栈:`[4, 6, 7]`  `cur = NULL`---## 4️⃣ 第四次 while 循环
- 出栈 `7`  `7 + pre(0) = 7` → 更新 `pre = 7`  树:4/ \
1   6/ \5   7`cur = NULL`---## 5️⃣ 第五次 while 循环
- 出栈 `6`  
`6 + pre(7) = 13` → 更新 `pre = 13`  
树:4/ \
1   13/  \5    7`cur = 5`---## 6️⃣ 第六次 while 循环
- `cur = 5` → 入栈  
栈:`[4, 5]`  
`cur = NULL`---## 7️⃣ 第七次 while 循环
- 出栈 `5`  
`5 + pre(13) = 18` → 更新 `pre = 18`  
树:4/ \
1   13/  \18    7`cur = NULL`---## 8️⃣ 第八次 while 循环
- 出栈 `4`  
`4 + pre(18) = 22` → 更新 `pre = 22`  
树:22/  \
1    13/  \18    7`cur = 1`---## 9️⃣ 第九次 while 循环
- `cur = 1` → 入栈  
栈:`[1]`  
`cur = NULL`---## 🔟 第十次 while 循环
- 出栈 `1`  
`1 + pre(22) = 23` → 更新 `pre = 23`  
树:
以此类推不过多赘述了。
http://www.xdnf.cn/news/17919.html

相关文章:

  • 计算机网络---传输控制协议Transmission Control Protocol(TCP)
  • 数据结构之顺序表相关算法题
  • Qt---Qt函数库
  • 西门子PLC通过稳联技术EtherCAT转Profinet网关连接baumuller伺服器的配置案例
  • Java基础 8.14
  • linux中的dump命令
  • Python训练营打卡Day32-神经网络的训练
  • 问题总结三
  • 财务自动化软件敏感数据泄露风险评估与防护措施
  • AI幻觉终结之后:GPT-5开启的“可靠性”新赛道与开发者生存指南
  • 边缘光效果加流光效果
  • 在启智平台使用A100对文心开源大模型Ernie4.5 0.3B微调(失败)
  • iOS混淆工具有哪些?游戏 App 防护下的混淆与加固全攻略
  • 应用银行卡识别技术,构建更安全、便捷的数字身份认证与支付生态
  • Linux下使用Samba 客户端访问 Samba 服务器的配置(Ubuntu Debian)
  • 分享一个基于Hadoop+spark的超市销售数据分析与可视化系统,超市顾客消费行为分析系统的设计与实现
  • 蓝桥杯STL stack
  • 【百度拥抱开源】百度开源文心一言视觉大模型—— ERNIE-4.5-VL
  • 《算法导论》第 24 章 - 单源最短路径
  • C# 贪吃蛇游戏
  • 审批流程系统设计与实现:状态驱动、灵活扩展的企业级解决方案
  • 调整磁盘分区格式为GPT
  • PyCharm性能优化与大型项目管理指南
  • 在CentOS系统中怎么查看Apache日志文件
  • Nginx学习笔记(八)—— Nginx缓存集成
  • ADB服务端调试
  • 机器学习学习报告
  • 考研408《计算机组成原理》复习笔记,第四章(2)——指令寻址和数据寻址
  • 飞算JavaAI:革新Java开发体验的智能助手
  • 19. 什么是 TypedArray