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

代码随想录算法训练营Day23|669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

目录

669. 修剪二叉搜索树

前言

思路

递归法

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

前言

递归法

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

前言

递归法

总结


669. 修剪二叉搜索树

题目链接

文章链接

前言

         本题承接昨天二叉搜索树的插入和删除操作题目,要对整棵二叉搜索树进行遍历修剪。

思路

        因为要遍历整棵二叉搜索树,因此不需要返回值也可以,我们可以完成修剪的操作,但是有返回值更方便,可以通过递归函数的返回值来移除节点。

递归法

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* trimBST(TreeNode* root, int low, int high) {if (root == NULL) return NULL;if (root->val < low){//寻找右子树符合区间的节点TreeNode* right = trimBST(root->right, low, high);return right;}if (root->val > high){//寻找左子树符合区间的节点TreeNode* left = trimBST(root->left, low, high);return left;}root->left = trimBST(root->left, low, high); root->right = trimBST(root->right, low, high); return root; }
};

        思路同前几题,依然是通过返回本次节点给上一层,上一层用左右孩子接住下一层的返回值。

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

题目链接

文章链接

前言

        题目强调得到的二叉搜索树必须平衡,因此不可以采用简单的线性结构构造二叉搜索树。要将有序数组的中值作为根节点,左侧作为左子树,右侧作为右子树。

递归法

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
private:TreeNode* traversal(vector<int>& nums, int left, int right){if (left > right) return NULL;int mid = left + (right - left) / 2;TreeNode* root = new TreeNode(nums[mid]);root->left = traversal(nums, left, mid - 1);root->right =  traversal(nums, mid + 1, right);return root;}
public:TreeNode* sortedArrayToBST(vector<int>& nums) {TreeNode* root = traversal(nums, 0, nums.size() - 1);return root;}
};

         在确定数组中值的时候以及递归时左右边界的确定,要严格根据遵守二分法,本题算法采用左闭右闭的区间形式。

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

题目链接

文章链接

前言

         将二叉搜索树转化为累加树本质上和数组逆序累加求和的思路一致,难点在于二叉树的遍历顺序。

递归法

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
private:int pre = 0; //记录前一个节点的数值void traversal(TreeNode* cur){if (cur == NULL) return;traversal(cur->right);cur->val += pre;pre = cur->val;traversal(cur->left);}
public:TreeNode* convertBST(TreeNode* root) {pre = 0;traversal(root);return root;}
};

        本题单层递归采用右中左的逆中序遍历顺序。

总结

        二叉树正式完结!后期要多回顾总结。

相关文章:

  • 实验五:动态路由配置
  • Rust-类型
  • 论文阅读1---OpenCalib论文阅读之factory calibration模块
  • 【linux】tcpdump 使用
  • Codeforces Round 761 (Div. 2) D2. Too Many Impostors (hard version)(交互+构造 最小次数)
  • DNS 在互联网中的作用是什么?
  • 01背包问题简单思路
  • QT下的几种实现modbus的库,记录
  • CSS水平垂直居中(最常见的三种方案flex、grid、absolute)
  • Android基于Matrix绘制PaintDrawable设置BitmapShader,以手指触点为中心显示原图的圆切图,Kotlin(4)
  • 基于stm32f103c8t6连接阿里云上传信息
  • kafka学习笔记-- 文件清理策略与高效读写数据
  • Java-基准测试
  • MySQL面试题2
  • 202406读书笔记|《沉睡的线条世界》——翻山越岭,只为与你分享点滴的快乐
  • JavaScript-如何实现克隆(clone)函数
  • 《深入 React 技术栈》
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 0x05 Python数据分析,Anaconda八斩刀
  • JSDuck 与 AngularJS 融合技巧
  • Kibana配置logstash,报表一体化
  • k个最大的数及变种小结
  • Meteor的表单提交:Form
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • React-redux的原理以及使用
  • SQL 难点解决:记录的引用
  • Vue组件定义
  • 大快搜索数据爬虫技术实例安装教学篇
  • 高性能JavaScript阅读简记(三)
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 小程序开发中的那些坑
  • 智能合约开发环境搭建及Hello World合约
  • PostgreSQL之连接数修改
  • scrapy中间件源码分析及常用中间件大全
  • 湖北分布式智能数据采集方法有哪些?
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • %@ page import=%的用法
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (一)u-boot-nand.bin的下载
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)EXC_BREAKPOINT僵尸错误
  • .NET BackgroundWorker
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET Core 版本不支持的问题
  • .NET delegate 委托 、 Event 事件,接口回调
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .Net程序帮助文档制作