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

【代码随想录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.lryc.cn/news/621231.html

相关文章:

  • CMake语法与Bash语法的区别
  • 扩展用例-失败的嵌套
  • 流式数据服务端怎么传给前端,前端怎么接收?
  • jenkins在windows配置sshpass
  • 设计模式笔记_行为型_状态模式
  • 【JavaEE】多线程 -- 线程状态
  • 纸箱拆垛:物流自动化中的“开箱密码”与3D视觉的智能革命
  • 面试题之项目中灰度发布是怎么做的
  • Flink on YARN启动全流程深度解析
  • 会议通信系统核心流程详解(底稿1)
  • Linux软件编程:进程和线程
  • C#面试题及详细答案120道(01-10)-- 基础语法与数据类型
  • Flink Stream API 源码走读 - socketTextStream
  • 2025H1手游市场:SLG领涨、休闲爆发,何为出海新航道?
  • 广告灯的左移右移
  • Day43 复习日
  • FPGA+护理:跨学科发展的探索(五)
  • Kotlin Data Classes 快速上手
  • 【深度学习】深度学习基础概念与初识PyTorch
  • 报数游戏(我将每文更新tips)
  • IPTV系统:开启视听与管理的全新篇章
  • 14 ABP Framework 文档管理
  • 【软考中级网络工程师】知识点之入侵防御系统:筑牢网络安全防线
  • SpringMVC(详细版从入门到精通)未完
  • P5967 [POI 2016] Korale 题解
  • 【数据分享】2014-2023年长江流域 (0.05度)5.5km分辨率的每小时日光诱导叶绿素荧光SIF数据
  • stm32项目(28)——基于stm32的环境监测并上传至onenet云平台
  • LT3045EDD#TRPBF ADI亚德诺 超低噪声LDO稳压器 电子元器件IC
  • web网站开发,在线%射击比赛成绩管理%系统开发demo,基于html,css,jquery,python,django,model,orm,mysql数据库
  • 模型选择与调优