代码随想录-算法训练营day23【二叉树09:修剪二叉搜索树、将有序数组转换为二叉搜索树、把二叉搜索树转换为累加树】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客

第六章 二叉树part09今日内容:● 669. 修剪二叉搜索树 
● 108.将有序数组转换为二叉搜索树 
● 538.把二叉搜索树转换为累加树 
● 总结篇 详细布置 669. 修剪二叉搜索树 这道题目比较难,比 添加增加和删除节点难的多,建议先看视频理解。题目链接/文章讲解: https://programmercarl.com/0669.%E4%BF%AE%E5%89%AA%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html  
视频讲解: https://www.bilibili.com/video/BV17P41177ud  108.将有序数组转换为二叉搜索树  本题就简单一些,可以尝试先自己做做。https://programmercarl.com/0108.%E5%B0%86%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E8%BD%AC%E6%8D%A2%E4%B8%BA%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html  
视频讲解:https://www.bilibili.com/video/BV1uR4y1X7qL  538.把二叉搜索树转换为累加树  本题也不难,在 求二叉搜索树的最小绝对差 和 众数 那两道题目 都讲过了 双指针法,思路是一样的。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  
视频讲解:https://www.bilibili.com/video/BV1d44y1f7wP总结篇  好了,二叉树大家就这样刷完了,做一个总结吧https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E6%80%BB%E7%BB%93%E7%AF%87.html   往日任务
● day 1 任务以及具体安排:https://docs.qq.com/doc/DUG9UR2ZUc3BjRUdY  
● day 2 任务以及具体安排:https://docs.qq.com/doc/DUGRwWXNOVEpyaVpG  
● day 3 任务以及具体安排:https://docs.qq.com/doc/DUGdqYWNYeGhlaVR6 
● day 4 任务以及具体安排:https://docs.qq.com/doc/DUFNjYUxYRHRVWklp 
● day 5 周日休息
● day 6 任务以及具体安排:https://docs.qq.com/doc/DUEtFSGdreWRuR2p4 
● day 7 任务以及具体安排:https://docs.qq.com/doc/DUElCb1NyTVpXa0Jj 
● day 8 任务以及具体安排:https://docs.qq.com/doc/DUGdsY2JFaFhDRVZH 
● day 9 任务以及具体安排:https://docs.qq.com/doc/DUHVXSnZNaXpVUHN4 
● day 10 任务以及具体安排:https://docs.qq.com/doc/DUElqeHh3cndDbW1Q 
●day 11 任务以及具体安排:https://docs.qq.com/doc/DUHh6UE5hUUZOZUd0 
●day 12 周日休息 
●day 13 任务以及具体安排:https://docs.qq.com/doc/DUHNpa3F4b2dMUWJ3 
●day 14 任务以及具体安排:https://docs.qq.com/doc/DUHRtdXZZSWFkeGdE 
●day 15 任务以及具体安排:https://docs.qq.com/doc/DUHN0ZVJuRmVYeWNv 
●day 16 任务以及具体安排:https://docs.qq.com/doc/DUHBQRm1aSWR4T2NK 
●day 17 任务以及具体安排:https://docs.qq.com/doc/DUFpXY3hBZkpabWFY 
●day 18 任务以及具体安排:https://docs.qq.com/doc/DUFFiVHl3YVlReVlr 
●day 19 周日休息
●day 20 任务以及具体安排:https://docs.qq.com/doc/DUGFRU2V6Z1F4alBH  
●day 21 任务以及具体安排:https://docs.qq.com/doc/DUHl2SGNvZmxqZm1X 
●day 22 任务以及具体安排:https://docs.qq.com/doc/DUHplVUp5YnN1bnBL

目录

0669_修剪二叉搜索树

0108_将有序数组转换为二叉搜索树

0538_把二叉搜索树转换为累加树

总结篇


0669_修剪二叉搜索树

递归

  1. 701.二叉搜索树中的插入操作
  2. 450.删除二叉搜索树中的节点
  3. 669.修剪二叉搜索树
package com.question.solve.leetcode.programmerCarl2._07_binaryTrees;public class _0669_修剪二叉搜索树 {
}/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution0669 {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在[low,high]范围内root.left = trimBST(root.left, low, high);root.right = trimBST(root.right, low, high);return root;}//iteration,迭代法public TreeNode trimBST2(TreeNode root, int low, int high) {if (root == null)return null;while (root != null && (root.val < low || root.val > high)) {if (root.val < low)root = root.right;elseroot = root.left;}TreeNode curr = root;//deal with root's left sub-tree, and deal with the value smaller than low.while (curr != null) {while (curr.left != null && curr.left.val < low) {curr.left = curr.left.right;}curr = curr.left;}//go back to root;curr = root;//deal with root's righg sub-tree, and deal with the value bigger than high.while (curr != null) {while (curr.right != null && curr.right.val > high) {curr.right = curr.right.left;}curr = curr.right;}return root;}
}

0108_将有序数组转换为二叉搜索树

做这道题目之前大家可以了解一下这几道:

  • 106.从中序与后序遍历序列构造二叉树(opens new window)
  • 654.最大二叉树 (opens new window)中其实已经讲过了,如果根据数组构造一棵二叉树。
  • 701.二叉搜索树中的插入操作(opens new window)
  • 450.删除二叉搜索树中的节点
package com.question.solve.leetcode.programmerCarl2._07_binaryTrees;import java.util.LinkedList;
import java.util.Queue;public class _0108_将有序数组转换为二叉搜索树 {
}/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution0108 {//递归:左闭右开,[left, right)public TreeNode sortedArrayToBST(int[] nums) {return sortedArrayToBST(nums, 0, nums.length);}public TreeNode sortedArrayToBST(int[] nums, int left, int right) {if (left >= right) {return null;}if (right - left == 1) {return new TreeNode(nums[left]);}int mid = left + (right - left) / 2;TreeNode root = new TreeNode(nums[mid]);root.left = sortedArrayToBST(nums, left, mid);root.right = sortedArrayToBST(nums, mid + 1, right);return root;}
}class Solution0108_2 {//递归:左闭右闭,[left, right]public TreeNode sortedArrayToBST(int[] nums) {TreeNode root = traversal(nums, 0, nums.length - 1);return root;}//左闭右闭区间[left, right]private TreeNode traversal(int[] nums, int left, int right) {if (left > right) return null;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;}
}class Solution0108_3 {//迭代:左闭右闭,[left, right]public TreeNode sortedArrayToBST(int[] nums) {if (nums.length == 0) return null;//根节点初始化TreeNode root = new TreeNode(-1);Queue<TreeNode> nodeQueue = new LinkedList<>();Queue<Integer> leftQueue = new LinkedList<>();Queue<Integer> rightQueue = new LinkedList<>();// 根节点入队列nodeQueue.offer(root);// 0为左区间下标初始位置leftQueue.offer(0);// nums.size() - 1为右区间下标初始位置rightQueue.offer(nums.length - 1);while (!nodeQueue.isEmpty()) {TreeNode currNode = nodeQueue.poll();int left = leftQueue.poll();int right = rightQueue.poll();int mid = left + ((right - left) >> 1);// 将mid对应的元素给中间节点currNode.val = nums[mid];// 处理左区间if (left <= mid - 1) {currNode.left = new TreeNode(-1);nodeQueue.offer(currNode.left);leftQueue.offer(left);rightQueue.offer(mid - 1);}// 处理右区间if (right >= mid + 1) {currNode.right = new TreeNode(-1);nodeQueue.offer(currNode.right);leftQueue.offer(mid + 1);rightQueue.offer(right);}}return root;}
}

0538_把二叉搜索树转换为累加树

package com.question.solve.leetcode.programmerCarl2._07_binaryTrees;import java.util.Stack;public class _0538_把二叉搜索树转换为累加树 {
}class Solution0538 {int sum;public TreeNode convertBST(TreeNode root) {sum = 0;convertBST1(root);return root;}//按右中左顺序遍历,累加即可public void convertBST1(TreeNode root) {if (root == null) {return;}convertBST1(root.right);sum += root.val;root.val = sum;convertBST1(root.left);}
}class Solution0538_2 {//DFS iteraion统一迭代法public TreeNode convertBST(TreeNode root) {int pre = 0;Stack<TreeNode> stack = new Stack<>();if (root == null) //edge case checkreturn null;stack.add(root);while (!stack.isEmpty()) {TreeNode curr = stack.peek();//curr != null的状况,只负责存node到stack中if (curr != null) {stack.pop();if (curr.left != null)      //左stack.add(curr.left);stack.add(curr);            //中stack.add(null);if (curr.right != null)     //右stack.add(curr.right);} else {//curr == null的状况,只负责做单层逻辑stack.pop();TreeNode temp = stack.pop();temp.val += pre;pre = temp.val;}}return root;}
}

总结篇

难,多复习,多总结。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/3345.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker入门学习

一、docker概念 Docker 引擎是使用的是Linux内核特性的容器引擎。 二、docker的安装 1.docker&#xff0c;下载地址&#xff1a; 桌面版&#xff1a;Docker Desktop: The #1 Containerization Tool for Developers | Docker 服务器版&#xff1a;Install Docker Engine | D…

C++ 一种交换两个数的思路

在 Lua 或者 Python 中可以使用多值赋值语句来交换两个数。例如&#xff1a;a, b b, a。在 C 中有没有类似的操作&#xff1f; 先解析一下多值赋值的原理&#xff0c;a, b b, a 等价于 t1, t2 b, a a, b t1, t2可以看到多值赋值还是用到了中间变量&#xff0c;而且还是两…

# 从浅入深 学习 SpringCloud 微服务架构(六)Feign(3)

从浅入深 学习 SpringCloud 微服务架构&#xff08;六&#xff09;Feign&#xff08;3&#xff09; 一、组件的使用方式总结 1、注册中心 1&#xff09; Eureka 搭建注册中心 引入依赖 spring-cloud-starter-netflix-eureka-server。 配置 EurekaServer。 通过 EnableEure…

前端路由的实现原理

当谈到前端路由时&#xff0c;指的是在前端应用中管理页面导航和URL的机制。前端路由使得单页应用&#xff08;Single-Page Application&#xff0c;SPA&#xff09;能够在用户与应用交互时动态地加载不同的视图&#xff0c;而无需每次都重新加载整个页面。 在前端开发中&…

如何在阿里云快速配置自动定时重启ECS云服务器?

背景 无论是电子商务、在线教育、游戏&#xff0c;还是流媒体等业务&#xff0c;服务器的稳定运行都是至关重要的。然而&#xff0c;在实际运行中&#xff0c;我们可能会遇到这样一些场景&#xff1a; 系统更新&#xff1a;一些操作系统或者软件的更新可能需要重启服务器才能…

PCA9685芯片手册学习求教

概述 项目使用树莓派和PCA9685模块连接舵机进行控制&#xff0c;参照pca9685模块手册写了驱动代码&#xff0c;能按照预期进行控制舵机。 记录一下后续回看。 %PCA9685 此处提供此类的摘要% 初始化输入参数&#xff1a;芯片地址默认&#xff08;0x40),输出通道(ch),输出频率…

【QEMU系统分析之启动篇(十八)】

系列文章目录 第十八章 QEMU系统仿真的加速器上电后设置分析 文章目录 系列文章目录第十八章 QEMU系统仿真的加速器上电后设置分析 前言一、QEMU是什么&#xff1f;二、QEMU系统仿真的启动分析1.系统仿真的初始化代码2.主循环数据初始化3. accel_setup_post(current_machine) …

bit、进制、位、时钟(窗口)、OSI七层网络模型、协议、各种码

1.bit与进制 &#xff08;个人理解&#xff0c;具体电路是非常复杂的&#xff09; 物理层数据流&#xff0c;bit表示物理层数据传输单位&#xff0c; 一个电路当中&#xff0c;通过通断来表示数字1和0 两个电路要通讯&#xff0c;至少要两根线&#xff0c;一根作为电势参照…

Java中使用Graphics2D绘制字符串文本自动换行 算法

效果&#xff1a; 代码&#xff1a; /*** return void* Author xia* Description //TODO 写字换行算法* Date 18:08 2021/4/1* Param []**/private static void drawWordAndLineFeed(Graphics2D g2d, Font font, String words, int wordsX, int wordsY, int wordsWidth) {FontD…

东北大学工程训练CNC加工中心(坤图)

东北大学加工中心&#xff08;CNC&#xff09;采用的系统为FANUC系统。 要求学生自主设计图样&#xff0c;编写GCODE文件&#xff0c;操作电脑使机床按设计路径铣出图案。 本人设计的图样为坤坤图 图为用CAD设计绘制的图样。 计算坐标&#xff0c;设计铣刀轨迹&#xff0c;得…

Linux--基础IO(上)

目录 1. 文件的边角知识 1.1 文件是什么&#xff1f; 1.2 文件是怎么打开的&#xff1f; 1.3 进程与文件 进程与文件的关系 2. 重温c语言文件接口 2.1 打开文件的方式 2.2 读写文件接口的重温 2.2.1 写文件 2.2.2 读文件 3. 系统文件I/O 3.1 系统接口 3.2 系…

【深度学习-第5篇】使用Python快速实现CNN分类(模式识别)任务,含一维、二维、三维数据演示案例(使用pytorch框架)

在之前的文章中介绍了CNN的图解入门&#xff0c;CNN的MATLAB分类实现&#xff0c;CNN的MATLAB回归实现。 卷积神经网络(Convolutional Neural Networ&#xff0c;简称CNN)是一种广泛应用于图像识别领域的深度学习算法。它通过模拟人类视觉系统的层次结构&#xff0c;可以自动提…

半导体芯片相关知识

半导体工业构成 半导体工业是一个涉及多个领域和环节的复杂产业链&#xff0c;其构成包括但不限于以下几个方面&#xff1a; 芯片设计&#xff1a; 芯片设计是半导体工业的基础&#xff0c;包括集成电路&#xff08;IC&#xff09;设计、系统芯片设计、模拟电路设计等。芯片设…

nginx-1.24.0 安装教程

下载nginx安装包 mkdir -p /home/app cd /home/app wget http://nginx.org/download/nginx-1.24.0.tar.gz 解压缩 tar -zxf nginx-1.24.0.tar.gz 下载nginx二进制包编译所需的工具和依赖 yum install gcc-c pcre pcre-devel zlib zlib-devel openssl openssl-devel -y 编译…

Arduino平衡小车

一&#xff0c;TB6612FNG电机驱动芯片 TB6612FNG是东芝半导体公司生产的一款直流电机驱动器件&#xff0c;它具有大电流MOSFET-H桥结构&#xff0c;双通道电路输出&#xff0c;可同时驱动2个电机. 参数名称参数值电压范围2.7-5.5V最大输入电压15V输出电流1.2A(平均)/3.2A&…

Vitis HLS 学习笔记--HLS入门示例集合-目录

目录 1. 示例集合概述 2. Interface 接口 2.1 Aggregation_Disaggregation 聚合与解聚 2.1.1 aggregation_of_m_axi_ports 2.1.2 aggregation_of_nested_structs 2.1.3 aggregation_of_struct 2.1.4 auto_disaggregation_of_struct 2.1.5 disaggregation_of_axis_port …

Lambda表达式与函数式接口

Lambda表达式与函数式接口 1. 函数式接口 1.1 什么是函数式接口 函数式接口是指只有一个抽象方法的接口&#xff08;Object的public方法除外。&#xff09;。这种接口可以使用Lambda表达式实现&#xff0c;从而实现函数式编程的特性。另外函数式接口可以有默认方法和静态方法…

Python 安装faiss失败

报错 遇到ModuleNotFoundError: No module named faiss&#xff0c;使用下面语句安装失败。 pip3 install faiss 遇到 ERROR: Could not find a version that satisfies the requirement faiss (from versions: none) ERROR: No matching distribution found for faiss …

模块化 手写实现webpack

模块化 common.js 的导入导出方法&#xff1a; require \ export 和 module.exports export 和 module.export nodejs 内存1.4G -> 2.8G cjs ESModule 主要区别&#xff1a; require属于动态类型&#xff1a;加载执行 同步 esmodul是静态类型&#xff1a;引入时并不会真的去…

[C++][算法基础]01背包问题(动态规划)

有 &#x1d441; 件物品和一个容量是 &#x1d449; 的背包。每件物品只能使用一次。 第 &#x1d456; 件物品的体积是 &#x1d463;&#x1d456;&#xff0c;价值是 &#x1d464;&#x1d456;。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不超过背包容量…