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

news/2024/11/15 17:15:20/文章来源:https://www.cnblogs.com/code4log/p/18416503

题目1235. 二叉搜索树的最近公共祖先

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]

img

示例 1:

输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
输出: 6 
解释: 节点 2 和节点 8 的最近公共祖先是 6。

示例 2:

输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
输出: 2
解释: 节点 2 和节点 4 的最近公共祖先是 2, 因为根据定义最近公共祖先节点可以为节点本身。

说明:

  • 所有节点的值都是唯一的。
  • p、q 为不同节点且均存在于给定的二叉搜索树中。

思路

暴力递归法

因为题目使用的是搜索二叉树,因此进行递归搜寻可以依照二叉搜索树的特性来进行,要注意的是递归边界是当前root为nullptr,p或者q。

代码

class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if(root == nullptr || root == p || root == q)return root;TreeNode* lft, *rht;if(p->val < root->val){lft = lowestCommonAncestor(root->left, p, q);}else{lft = lowestCommonAncestor(root->right, p, q);}if(q->val < root->val){rht = lowestCommonAncestor(root->left, p, q);}else{rht = lowestCommonAncestor(root->right, p, q);}if((lft == p && rht == q) || (lft == q && rht == p)){return root;}lft = lft == p || lft == q ? lft : rht;return lft;}
};

利用二叉树特性来查找公共祖先*

由于题目给出的是二叉搜索树,因此只要当前节点的val为首个在p和q节点的val之间的值则说明已经碰到了公共祖先。

递归

class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if(p->val < root->val && q->val < root->val){return lowestCommonAncestor(root->left, p, q);}   else if(p->val > root->val && q->val > root->val){return lowestCommonAncestor(root->right, p, q);}return root;}
};

迭代

class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {while(1){if(root->val < p->val && root->val < q->val){root = root->right;}else if(root->val > p->val && root->val > q->val){root = root->left;}else{return root;}}return root;}
};

题目2 701. 二叉搜索树中的插入操作

给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。

注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果

示例 1:

img

输入:root = [4,2,7,1,3], val = 5
输出:[4,2,7,1,3,5]
解释:另一个满足题目要求可以通过的树是:

示例 2:

输入:root = [40,20,60,10,30,50,70], val = 25
输出:[40,20,60,10,30,50,70,null,null,25]

示例 3:

输入:root = [4,2,7,1,3,null,null,null,null,null,null], val = 5
输出:[4,2,7,1,3,5]

提示:

  • 树中的节点数将在 [0, 104]的范围内。
  • -108 <= Node.val <= 108
  • 所有值 Node.val独一无二 的。
  • -108 <= val <= 108
  • 保证 val 在原始BST中不存在。

思路

既然这道题没有插入的限制的话,只要将新节点加在叶子节点上就可以了。

代码

class Solution {
public:TreeNode* insertIntoBST(TreeNode* root, int val) {if(!root)return new TreeNode(val);if(root->val < val){root->right = insertIntoBST(root->right, val);}else{root->left = insertIntoBST(root->left, val);}return root;}
};

题目3 450. 删除二叉搜索树中的节点

给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。

一般来说,删除节点可分为两个步骤:

  1. 首先找到需要删除的节点;
  2. 如果找到了,删除它。

示例 1:

img

输入:root = [5,3,6,2,4,null,7], key = 3
输出:[5,4,6,2,null,null,7]
解释:给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。
一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。
另一个正确答案是 [5,2,6,null,4,null,7]。

示例 2:

输入: root = [5,3,6,2,4,null,7], key = 0
输出: [5,3,6,2,4,null,7]
解释: 二叉树不包含值为 0 的节点

示例 3:

输入: root = [], key = 0
输出: []

思路

查询key对应的节点可以利用二叉搜索树的特性,查询到对应的值后需要对节点的左子树和右子树进行处理,并移除root节点。

代码

class Solution {
public:TreeNode* deleteNode(TreeNode* root, int key) {if(root == nullptr){return root;}if(root->val > key){root->left = deleteNode(root->left, key);}else if(root->val < key){root->right = deleteNode(root->right, key);}else{if(root->right != nullptr){TreeNode* tmpNode = root;TreeNode* curNode = root->right;TreeNode* lftNode = root->left;delete root;root = curNode;while(curNode->left){curNode = curNode->left;}curNode->left = lftNode;}else{TreeNode* tmpNode = root;root = root->left;delete tmpNode;}}return root;}
};

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

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

相关文章

6、函数的声明

程序是一行行执行,我们可以在前面进行函数声明,然后将函数的定义放在程序末尾。 声明可以写多次,但是定义只能写一次。

如何基于Java解析国密数字证书

一、说明 随着信息安全的重要性日益凸显,数字证书在各种安全通信场景中扮演着至关重要的角色。国密算法,一、说明 随着信息安全的重要性日益凸显,数字证书在各种安全通信场景中扮演着至关重要的角色。国密算法,作为我国自主研发的加密算法标准,其应用也愈发广泛。然而,在…

Windows应急响应-个人整理

个人总览-仍待完善Windows应急响应整理(一)参考 1.NOPTeam的手册链接 2.fox-yu的博客(思路很清晰,对我这个小白来说很友好)1.整体思路 1.1常见事件类型(不完整、待补充)网络协议攻击:拒绝服务攻击:DDos、CC攻击、泛洪攻击等。链接 DNS劫持 ARP欺骗web入侵:webshell 网页挂马…

视野修炼-技术周刊第101期 | 垂直居中

① align-content - 垂直居中普通元素 ② up mode - 一键隐藏 Chrome 插件 ③ Chrome 性能面板新功能 ④ k-colors.js - 图片主色提取 ⑤ 英:优化JS性能的一些技巧 ⑥ 英:Web 的剪贴板,如何存储不同类型的数据 ⑦ 英:不简单的 js 入门教程 ⑧ Peter Cat - GitHub 仓库智能答…

06: 抽象工厂模式

提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类1. 案例 在Access和SQL server分别插入User表和Department表 2. 抽象工厂模式结构 - 抽象产品(AbstractProduct):所有产品的基类,提供产品类的公共方法struct User {std::string m_sName = "";…

南沙C++信奥老师解一本通题 1371:看病

​【题目描述】有个朋友在医院工作,想请BSNY帮忙做个登记系统。具体是这样的,最近来医院看病的人越来越多了,因此很多人要排队,只有当空闲时放一批病人看病。但医院的排队不同其他排队,因为多数情况下,需要病情严重的人优先看病,所以希望BSNY设计系统时,以病情的严重情…

堪称最优秀的 Docker 可视化管理工具 ——Portainer

Portainer 是一款轻量级的应用,它提供了图形化界面,用于方便地管理 Docker 环境,包括单机环境和集群环境。随着 Docker 内实例越来越多,就得涉及到监控以及统计的需求:有多少个容器?运行的有几个?有哪些容器 CPU 使用率低?... Portainer 是一款轻量级的应用,它提供了图…

分布式数据库中间件:MyCat 和 ShardingSphere

分布式数据库中间件 用于实现 分库、分表、分片、分布式事务、读写分离 等。 本文 是 调查 MyCat 和 ShardingSphere 两款 中间件 的一些信息汇总。本文时间:2024年9月。MyCat Mycat数据库分库分表中间件。ben发布于博客园 http://www.mycat.org.cn github-Mycat1 https://gi…

Python 遭遇 ProxyError 问题记录

本内容复制知乎的一个贴子,在此只做下记录及参考和学习,原链接地址: 最近遇到的一个问题,在搞清楚之后才发现这么多年的 HTTPS_PROXY 都配置错了! 起因 想用 Python 在网上下载一些图片素材,结果 requests 报 requests.exceptions.ProxyError,具体的错误信息见下面。当然…

白云龙期货投资-第二讲

K线图基本用途就是为了寻找“买卖点”,所有的进场点有K线配合能大大的提高进场的成功率。关键点位出现K线及组合配合。大胆进场(波浪理论第五浪。回调黄金分割率点,趋势线,颈线,整数关口等)。K线技术-一切技术之根本 K线图基本用途就是为了寻找“买卖点”,所有的进场点有K…

博客园主题皮肤

背景图:目前使用的是Awescnb主题的geek 参照:https://blog.csdn.net/zk_tww/article/details/141030258

用户验收测试指南0简介

0 简介 这是一本关于多种形式的用户验收测试(UAT)及其用途的。它汇集了有关测试、项目管理、质量管理、团队行为和完整的用户验收测试经验的其他相关材料,并将它们编织成一条牢固可靠的生命线,供用户验收测试新手指南或利益相关者参考。 本书是为满足三类不同人群的需求而编…