代码随想录算法 - 二叉树7

news/2024/9/19 14:16:44/文章来源:https://www.cnblogs.com/code4log/p/18416911

题目1 669. 修剪二叉搜索树

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

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

示例 1:

img

输入:root = [1,0,2], low = 1, high = 2
输出:[1,null,2]

示例 2:

img

输入:root = [3,0,4,null,2,null,null,1], low = 1, high = 3
输出:[3,2,null,1]

提示:

  • 树中节点数在范围 [1, 104]
  • 0 <= Node.val <= 104
  • 树中每个节点的值都是 唯一
  • 题目数据保证输入是一棵有效的二叉搜索树
  • 0 <= low <= high <= 104

思路

既然搜索后要继续保持树为二叉搜索树,则应该移除范围外的节点,并保留范围内的节点。因此,当节点的val不在范围内时,需要返回相应的左节点或者右节点。

代码

//递归法 
class Solution {
public:TreeNode* trimBST(TreeNode* root, int low, int high) {if(root == nullptr){return root;}if(root->val < low){return trimBST(root->right, low, high);}else 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) {while(root){if(root->val < low)root = root->right;else if(root->val > high)root = root->left;elsebreak;}TreeNode* curNode = root;while(curNode){if(curNode->left && curNode->left->val < low){curNode->left = curNode->left->right;}elsecurNode = curNode->left;}curNode = root;while(curNode){if(curNode->right && curNode->right->val > high){curNode->right = curNode->right->left;}elsecurNode = curNode->right;}return root;}
};

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

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵

平衡

二叉搜索树。

示例 1:

img

输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:

示例 2:

img

输入:nums = [1,3]
输出:[3,1]
解释:[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。

提示:

  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums严格递增 顺序排列

思路

使用递归和分而治之的思想,每次处理数组中中间的节点,并让中间节点指向新的子节点;使用递归也是类似的思路,每次处理一个范围的中间节点,范围用额外的2个queue来保存。

代码

class Solution {
public:TreeNode* createTree(vector<int>& nums, int lft, int rht){if(lft > rht)return nullptr;TreeNode* curNode = new TreeNode(nums[(rht + lft) / 2]);curNode->left = createTree(nums, lft, (rht + lft) / 2 - 1);curNode->right = createTree(nums, (lft + rht) / 2 + 1, rht);return curNode;}TreeNode* sortedArrayToBST(vector<int>& nums) {return createTree(nums, 0, nums.size() - 1);}
};

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

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

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

  • 节点的左子树仅包含键 小于 节点键的节点。
  • 节点的右子树仅包含键 大于 节点键的节点。
  • 左右子树也必须是二叉搜索树。

注意:本题和 1038: https://leetcode-cn.com/problems/binary-search-tree-to-greater-sum-tree/ 相同

示例 1:

img

输入:[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]

示例 2:

输入:root = [0,null,1]
输出:[1,null,1]

示例 3:

输入:root = [1,0,2]
输出:[3,3,2]

示例 4:

输入:root = [3,2,4,1]
输出:[7,9,4,10]

提示:

  • 树中的节点数介于 0104 之间。
  • 每个节点的值介于 -104104 之间。
  • 树中的所有值 互不相同
  • 给定的树为二叉搜索树。

思路

因为二叉搜索树的最右侧节点是最大的,因此使用翻转过的中序遍历,按照右当前节点左的顺序遍历并累加节点值就能保证生产的结果为累加树。

递归法

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

迭代法

class Solution {
public:TreeNode* convertBST(TreeNode* root) {if(root == nullptr)return root;stack<TreeNode*> nodeStack;nodeStack.push(root);int num = 0;while(!nodeStack.empty()){TreeNode* curNode = nodeStack.top();if(curNode != nullptr){nodeStack.push(nullptr);if(curNode->right){nodeStack.push(curNode->right);}}else{nodeStack.pop();curNode = nodeStack.top();nodeStack.pop();curNode->val += num;num = curNode->val;if(curNode->left){nodeStack.push(curNode->left);}}}return root;}
};

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

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

相关文章

Docker 进阶篇-CIG 重量级监控系统

上一篇讲的是轻量级的监控工具,本文就来讲重量级的: CAdvisor + InfluxDB + Granfana,简称 CIG。上一篇讲的是轻量级的监控工具,本文就来讲重量级的: CAdvisor + InfluxDB + Granfana,简称 CIG。 ​ ‍ ‍ docker stats 原生的 Docker 命令中,stats 可以查看每个容器占用…

macOS Sequoia 15 发布,iPhone 镜像、密码应用程序、窗口平铺更新等带来全新体验

macOS Sequoia 15 发布,iPhone 镜像、密码应用程序、窗口平铺更新等带来全新体验macOS Sequoia 15 发布,iPhone 镜像、密码应用程序、窗口平铺更新等带来全新体验 2024 年 9 月 17 日凌晨 1 点 请访问原文链接:https://sysin.org/blog/macOS-Sequoia/,查看最新版。原创作品…

基于Java+Springboot+Vue开发的大学竞赛报名管理系统

项目简介该项目是基于Java+Springboot+Vue开发的大学竞赛报名管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的大学竞赛报名管理系统项目,大学生可以在…

基于Java+Springboot+Vue开发的蛋糕商城管理系统

项目简介该项目是基于Java+Springboot+Vue开发的蛋糕商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的蛋糕商城管理系统项目,大学生可以在实践中学…

产品架构图

这批产品架构图一出,设计、前后端都得服的

VMware Avi Load Balancer 30.2.2 发布下载,新增功能概览

VMware Avi Load Balancer 30.2.2 发布下载,新增功能概览VMware Avi Load Balancer 30.2.2 - 多云负载均衡平台 应用交付:多云负载均衡、Web 应用防火墙和容器 Ingress 服务 请访问原文链接:https://sysin.org/blog/vmware-avi-load-balancer-30/,查看最新版。原创作品,转…

用户验收测试指南1UAT的重要性

1 UAT的重要性 简介中介绍了一些有助于更好地理解 UAT 的一般概念,并介绍了一些备受瞩目的项目失败案例。这些失败即使不是由 UAT 引起的,也肯定不是由 UAT 避免的。第 1 章概述了 UAT、UAT 的目的、UAT 与实施项目的关系以及参与项目的人员。您将了解为什么 UAT 不同于其他类…

读构建可扩展分布式系统:方法与实践06异步消息传递

异步消息传递1. 异步消息传递 1.1. 通信是分布式系统的基础,也是架构师需要纳入其系统设计的主要问题 1.2. 客户端发送请求并等待服务器响应1.2.1. 这就是大多数分布式通信的设计方式,因为客户端需要得到即时响应后才能继续1.2.2. 并非所有系统都有这个要求1.3. 使用异步通信…

mysql 官方架构相关图

一些来自 MySQL 官网的图片汇总。 主要是 8.4 版本的 manual。架构图01 Figure 18.3 MySQL Architecture with Pluggable Storage Engines https://dev.mysql.com/doc/refman/8.4/en/pluggable-storage-overview.html架构图02:InnoDB InnoDB Architecture https://dev.mysql.c…

mysql 架构相关图

一些来自 MySQL 官网的图片汇总。 主要是 8.4 版本的 manual。架构图01 Figure 18.3 MySQL Architecture with Pluggable Storage Engines https://dev.mysql.com/doc/refman/8.4/en/pluggable-storage-overview.html架构图02:InnoDB InnoDB Architecture https://dev.mysql.c…

mac 中安装 homebrew

原链接:https://zhuanlan.zhihu.com/p/905081701. 写在前面curl: (7) Failed to connect to raw.githubusercontent.com port 443: Operation timed out使用官方脚本遇到上面的错误提示:请按照下面「安装步骤」步骤执行。 2. 安装步骤 如果有更换镜像源的想法,强烈推荐使用镜…

Spring框架漏洞总结

本篇文章主要是内容常见Spring漏洞的解析以及理解。目录SpEL注入攻击Spring H2 Database Console未授权访问Spring Security OAuth2远程命令执行漏洞(CVE-2016-4977)Spring WebFlow远程代码执行漏洞(CVE-2017-4971)Spring Data Rest远程命令执行漏洞(CVE-2017-8046)Spring Mess…