【算法day16】二叉树:搜索二叉树的修剪与构建

ops/2024/12/18 10:02:36/

题目引用


  1. 修剪二叉搜索树
  2. 将有序数组转换为二叉搜索树
  3. 把二叉搜索树转换为累加树

1. 修剪二叉搜索树


给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在 唯一的答案 。

所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。

示例 1:
在这里插入图片描述
输入:root = [1,0,2], low = 1, high = 2
输出:[1,null,2]

我们来看这道题目,我们需要修剪小于low大于high的所有节点。那么我们就很容易写出以下代码:

TreeNode* trimBST(TreeNode* root, int low, int high) {if (root == nullptr || root->val < low || root->val > high) return nullptr;root->left = trimBST(root->left, low, high);root->right = trimBST(root->right, low, high);return root;}

但是这样写有一个问题,我们的修剪完之后我们会发现多修剪了几个节点,因为当我们遇到比low小的节点时直接剪掉它了,连同它可能符合条件的右子树,同理我们也剪掉了比high大的节点和它的左子树。这样就很尴尬了,难不成我们需要把整棵树遍历一遍把符合条件的节点摘出来吗?
不不不,我们可以在判断条件时将不符合条件的节点暂时保留并遍历其的左或右子树来筛选出符合条件的节点。那我们直接来看代码:

TreeNode* trimBST(TreeNode* root, int low, int high) {if(root==nullptr) return nullptr;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;}

那么这道题目就完美的解决啦~

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


给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。

示例 1:
在这里插入图片描述
输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:
在这里插入图片描述

我们来看这道题目,要求我们返回一个 平衡 的二叉搜索树。为什么这样要求?因为给的数组是有序的,我们一直将数组的下一个元素作为当前节点的右子树,这样返回也是二叉搜索树,所以会要求平衡。那么这题其实是很好解决的,既然要求我平衡,那么我们每次都就从数组的中间取元素形成节点,然后向下一层递归。那么这道题就牵扯到了咱们梦开始的地方,二分查找 了。那就很简单了呀,每次递归取mid,下一层遍历mid-1以前,和mid+1之后,到最后返回root。这道题目就解决了。
来看代码:

	TreeNode* traversal(vector<int>& nums,int left,int right){if(left>right) return nullptr;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) {TreeNode* root = traversal(nums, 0, nums.size() - 1);return root;}

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


给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。

提醒一下,二叉搜索树满足下列约束条件:

节点的左子树仅包含键 小于 节点键的节点。
节点的右子树仅包含键 大于 节点键的节点。
左右子树也必须是二叉搜索树。
注意:本题和 1038 相同

示例 1:
在这里插入图片描述
输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
输出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]

对于这种非常规的题目,一般来说都是找规律,找不到规律就找到其中一些关键点对其进行模拟,就能解决啦。那么我们来找这道题目的规律,很容易就能发现是从右下角的节点开始累加的,是一个先走右,再走中,最后走左这样一个关系,剩下就是记录累加和就行了。
来看代码:

int pre = 0; // 记录前一个节点的数值void traversal(TreeNode* cur) { // 右中左遍历if (cur == NULL) return;traversal(cur->right);cur->val += pre;pre = cur->val;traversal(cur->left);}TreeNode* convertBST(TreeNode* root) {pre = 0;traversal(root);return root;}

总结


那么到此为止咱们的二叉树章节终于结束啦,是不是过的很快,当然啦,当你沉下心想好好学一个东西时,时间总是会不够用的,我辈键客,当厚积薄发,海纳百川,待时而出,一鸣惊人!共勉~


http://www.ppmy.cn/ops/142876.html

相关文章

如何使用 Python 读取和写入 CSV 文件?

在Python中&#xff0c;处理CSV文件是一项常见的任务&#xff0c;通常用于数据交换和数据存储。 Python的标准库csv模块提供了一种方便的方式来读取和写入CSV文件。 下面我将详细介绍如何使用Python的csv模块来读取和写入CSV文件&#xff0c;并提供一些实际开发中的建议和注意…

React Native安卓模拟器闪退问题1

今天遇到一个奇葩问题 问题描述&#xff1a;真机执行开发调试正常&#xff0c;使用Android模拟器的时候发现app启动时闪退&#xff0c;在logcat里的error信息如下 Fatal signal 6 (SIGABRT), code 0 (SI_USER) in tid 22732 (FlipperEventBas), pid 22700 通义灵码的解释是有…

Python `__slots__` 进阶指南:不止于节省内存,从原理到实践

相信不少 Python 开发者都听说过 __slots__&#xff0c;知道它可以帮助节省内存。但你是否思考过它背后的原理&#xff0c;以及在实际开发中的其他妙用&#xff1f;让我们一起深入探讨。 从一个性能问题说起 假设你的一个系统需要处理大量的订单对象&#xff1a; class Orde…

安装 telnet

参考链接 https://www.python100.com/html/80855.html Linux telnet 命令安装_failed to start telnet.service: unit not found.-CSDN博客 解决启动的问题&#xff0c;出问题优先看这个 安装telnet服务&#xff0c;以及遇到的一些坑_unit telnet.service could not be fou…

leetcode简单题数组和技巧题

数组是一种基础数据结构&#xff0c;可以用来处理常见的排序和二分搜索问题&#xff0c;典型的处理技巧包括对撞指针、滑动窗口等。 面试中的算法问题&#xff0c;有很多并不需要复杂的数据结构支撑&#xff0c;就是用数组&#xff0c;就能考察出很多东西。 题型1&#xff1a;…

6.1 初探MapReduce

MapReduce是一种分布式计算框架&#xff0c;用于处理大规模数据集。其核心思想是“分而治之”&#xff0c;通过Map阶段将任务分解为多个简单任务并行处理&#xff0c;然后在Reduce阶段汇总结果。MapReduce编程模型包括Map和Reduce两个阶段&#xff0c;数据来源和结果存储通常在…

golang 判断一个点是否在一个多边形内

我有一需求为&#xff1a;判断一个点&#xff08;经纬度范围&#xff09;是否在一个多边形范围内&#xff08;多个经纬度点&#xff09; 这里我借助几何库&#xff08; github.com/paulmach/orb&#xff09;来处理地理空间数据 可以通过在线获取经纬度来确认代码正确性 packa…

开源 AI 智能名片微信小程序在企业微信生态中的创新应用与价值拓展

摘要&#xff1a;本论文聚焦于企业微信这一重要的企业通信与办公工具&#xff0c;深入探讨开源 AI 智能名片微信小程序如何与之深度融合并发挥独特作用。分析企业微信的功能特性以及在企业内外连接方面的重要意义&#xff0c;阐述开源 AI 智能名片微信小程序在增强企业社交互动…