代码随想录二刷Day23

今日任务

669.修剪二叉搜索树
108.将有序数组转换为二叉搜索树
538.把二叉搜索树转换为累加树
语言:C++

669. 修剪二叉搜索树

链接:https://leetcode.cn/problems/trim-a-binary-search-tree/
递归

class Solution {public:TreeNode* trimBST(TreeNode* root, int low, int high) {if(root == NULL) return NULL;if(root->val < low) return trimBST(root->right, low, high);if(root->val > high) return trimBST(root->left, low, high);root->left = trimBST(root->left, low, high);root->right = trimBST(root->right, low, high);return root;}
};

迭代

class Solution {public:TreeNode* trimBST(TreeNode* root, int low, int high) {if(root == NULL) return NULL;while(root && (root->val < low || root->val > high)){if(root->val < low) root = root->right; //左边没必要修建了,都不符合条件else root = root->left;}//当前root的值肯定是位于[low,high]中的TreeNode* cur = root;while(cur){//左侧的值是更小的,直接剪掉while(cur->left && cur->left->val < low){cur->left = cur->left->right;}cur = cur->left;}cur = root;while(cur){//右侧的值是更大的,直接剪掉while(cur->right && cur->right->val > high){cur->right = cur->right->left;}cur = cur->right;}return root;}
};

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

链接:https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/
递归

class Solution {public:TreeNode* traversal(vector<int>& nums, int left, int right){if(left > right) return NULL;if(left == right) return new TreeNode(nums[left]);int mid = left + ((right - left) >> 1);TreeNode* root = new TreeNode(nums[mid]);root->left = traversal(nums, left, mid - 1);root->right = traversal(nums, mid + 1, right);return root;}TreeNode* sortedArrayToBST(vector<int>& nums) {if(nums.size() == 1) return new TreeNode(nums[0]);return traversal(nums, 0, nums.size() - 1);}
};

迭代

class Solution {public:TreeNode* sortedArrayToBST(vector<int>& nums) {queue<TreeNode*> nodeQue;queue<int> leftQue;queue<int> rightQue;TreeNode* root = new TreeNode(0);nodeQue.push(root);leftQue.push(0);rightQue.push(nums.size() - 1);while(!nodeQue.empty()){int left = leftQue.front(); leftQue.pop();int right = rightQue.front(); rightQue.pop();int mid = left + ((right - left) >> 1);TreeNode* cur = nodeQue.front(); nodeQue.pop();cur->val = nums[mid];if(left <= mid - 1){cur->left = new TreeNode(0);nodeQue.push(cur->left);leftQue.push(left);rightQue.push(mid - 1);}if(mid + 1 <= right){cur->right = new TreeNode(0);nodeQue.push(cur->right);leftQue.push(mid + 1);rightQue.push(right);}}return root;}
};

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

链接:https://leetcode.cn/problems/convert-bst-to-greater-tree/
递归

class Solution {public:int sum = 0;int curSum = 0;void getSum(TreeNode* root){if(root == NULL) return;getSum(root->left);sum += root->val;getSum(root->right);}void traversal(TreeNode* root){if(root == NULL) return;traversal(root->left);int tmp = root->val;root->val = sum - curSum;curSum += tmp;traversal(root->right); }TreeNode* convertBST(TreeNode* root) {if(root == NULL) return root;getSum(root);traversal(root);return root;}
};

没有必要中序遍历,按照右中左遍历即可

class Solution {public:int pre = 0;void traversal(TreeNode* root){if(root == NULL) return;traversal(root->right);root->val += pre;pre = root->val;traversal(root->left);}TreeNode* convertBST(TreeNode* root) {traversal(root);return root;}
};

迭代

class Solution {public:TreeNode* convertBST(TreeNode* root) {if(root == NULL) return root;int pre = 0;stack<TreeNode*> st;TreeNode* cur = root;//中序遍历反过来 while(!st.empty() || cur){if(cur){st.push(cur); //rootcur = cur->right;}else{cur = st.top();st.pop();cur->val += pre;pre = cur->val;cur = cur->left;}}return root;}
};

【代码随想录二刷】Day23-二叉树-C++相关推荐

  1. 【代码随想录二刷】Day21-二叉树-C++

    代码随想录二刷Day21 今日任务 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236.二叉树的最近公共祖先 语言:C++ 530. 二叉搜索树的最小绝对差 链接:https://le ...

  2. 【代码随想录二刷】Day15-二叉树-C++

    代码随想录二刷Day15 今日任务 层序遍历 226.翻转二叉树 101.对称二叉树 语言:C++ 层序遍历 102.二叉树的层序遍历 class Solution {public:vector< ...

  3. 【代码随想录二刷】Day20-二叉树-C++

    代码随想录二刷Day20 今日任务 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树 语言:C++ 654. 最大二叉树 链接:https://leetcode ...

  4. 代码随想录二刷——动规篇章

    dp 动态规划篇 dp篇二刷复习 路径种数问题 63.不同路径 II 拆分问题 343. 整数拆分 96.不同的二叉搜索树 背包问题 0-1背包,最多选一个,选or不选 406.分割等和子集 1049 ...

  5. 【代码随想录二刷】day9 | 28. 实现 strStr() 459.重复的子字符串

    二刷主要记录理解不一样的题 一刷地址:day9 今日题目:中等 KMP:困难 => 第一时间想到了使用KMP,但是不太会,只有用常规方法完成 实现 strStr():拼接完两个字符串s之后,取其 ...

  6. 【代码随想录二刷】day 25 | 216.组合总和III 17.电话号码的字母组合

    二刷主要记录理解不一样的题 一刷地址:day25 今日题目:中等 组合总和III :注意剪枝操作:①sum>n:②path.size()>k class Solution {LinkedL ...

  7. <代码随想录二刷>链表

    文章目录 203. 移除链表元素 题目描述 思路分析 参考代码 206. 反转链表 题目描述 思路分析 参考代码 24. 两两交换链表中的节点 题目描述 思路分析 参考代码 19. 删除链表的倒数第 ...

  8. 随想录二刷Day15——二叉树

    文章目录 二叉树 2. 递归遍历二叉树 3. 二叉树的迭代遍历 4. 二叉树的统一迭代法 二叉树 2. 递归遍历二叉树 144. 二叉树的前序遍历 class Solution {public:vec ...

  9. 代码随想录二刷链表篇

    链表 2.移除链表元素 ● 如果head为空就返回head,定义虚拟头节点,pre节点,cur节点.当cur 不等于null时. ● 如果当前节点的值等于val,pre.next = cur.next ...

最新文章

  1. 记者因报道大厂负面遭遇死亡威胁,幕后黑手被判入狱18个月
  2. TensorFlow接口升级汇总
  3. vector作为参数传递到dll问题
  4. php webservice 上传,PHP实现WebService服务
  5. 早期计算机的应用主要是( ) (2分),计算机基础第1次作业(含答案)
  6. 匿名内部类和匿名类_匿名schanonymous
  7. 沉淀一年零八个月,我也拿到了博客专家
  8. PyTorch:VGG16简单入门版
  9. Unity Occlusion Culling 遮挡剔除研究
  10. 动态新增表字段_国际法规 | 欧盟POPs法规更新新增三氯杀螨醇、修订PFOS的豁免——北测集团...
  11. CustomViewWith_Image_Text_Video
  12. 注解@PostConstruct与@PreDestroy讲解及实例
  13. “飞客蠕虫”形成全球最大僵尸网络 每日感染数万网民
  14. 全国各地电台在线收听大全(转)
  15. 修改用户密码命令linux,linux下passwd命令设置修改用户密码 - Alanf - 博客园
  16. 微信渐变国旗头像来了!一键生成
  17. Python爬虫自学系列(一)
  18. MATLAB的GUI设计——计算器
  19. 下载上市公司财报并可视化某科目
  20. 【蓝桥杯】 C++ 顺子日期

热门文章

  1. GitHub标星30K+的Java面试八股文长啥样?
  2. Java并发指南17:Java常见多线程面试题及答案
  3. fedora配置阿里云镜像
  4. 阿特拉斯拧紧枪说明书_阿特拉斯枪样本.pdf
  5. 红米note7找android,红米note7荣耀v20简单上手体验
  6. documents4j:Java文档格式转换开发库
  7. No documents matching xxx.h could be found
  8. RHCSA-A4.创建指定的用户账户
  9. Webshell工具的流量特征分析(菜刀,蚁剑,冰蝎,哥斯拉)
  10. python unicode.category