二叉树例题分享

文章目录

  • 二叉树例题分享
      • [235. 二叉搜索树的最近公共祖先](https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/)
      • [701. 二叉搜索树中的插入操作](https://leetcode.cn/problems/insert-into-a-binary-search-tree/)
      • [108. 将有序数组转换为二叉搜索树](https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/)
      • [450. 删除二叉搜索树中的节点](https://leetcode.cn/problems/delete-node-in-a-bst/)

二叉树例题分享

235. 二叉搜索树的最近公共祖先

题目

在这里插入图片描述

代码

struct TreeNode* lowestCommonAncestor(struct TreeNode* root, struct TreeNode* p,struct TreeNode* q) {struct TreeNode* ans = root;while (ans != NULL) {if (ans->val > p->val && ans->val > q->val) {ans = ans->left;} else if (ans->val < p->val && ans->val < q->val) {ans = ans->right;} else {return ans;}}return ans;
}

题解

本题要求我们找到二叉搜索树中两个节点的最小公共祖先,因为是二叉搜索树,所以实现起来还是比较简单的,因为二叉搜索树的左子树数值一定小于根节点数值小于右子树数值。

多以我们遍历一遍二叉树就可以找到答案:

  • 如果ans节点数值同时大于p,q数值,那么p,q一定在ans节点的左边,向左遍历;
  • 如果ans节点数值同时小于p,q数值,那么p,q一定在ans节点的右边,向右遍历;
  • 如果一大一小,那证明找到了最近公共祖先。

总体来说只要我们知道在什么情况下是最近公共祖先,我们就可以轻松实现本题要求。

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

题目

在这里插入图片描述

代码

struct TreeNode* insertIntoBST(struct TreeNode* root, int val) {struct TreeNode* ans = root;struct TreeNode* new = (struct TreeNode*)malloc(sizeof(struct TreeNode));new->left = NULL;new->right = NULL;new->val = val;if (root == NULL)return new;while (root) {if (root->val > val) {if (root->left != NULL)root = root->left;else {root->left = new;return ans;}} else {if (root->right != NULL)root = root->right;else {root->right = new;return ans;}}}return ans;
}

题解

本题可以使用两种方法去实现:

第一种

​ 迭代法

迭代法是我在没有看题解情况下完成的。

因为是二叉搜索树,所以我们遍历一次便可以实现。

我们在遍历二叉树的时候,如果本节点的数值大于val,则证明val应该插入到左子树中,反之插入右子树中,我们只需要继续判断本节点的左孩子节点(右孩子节点)是否为空,如果不为空则继续遍历,如果为空则证明该位置就为插入位置。

下面是代码:

struct TreeNode* insertIntoBST(struct TreeNode* root, int val) {if (root == NULL)return root;struct TreeNode* ans = root;struct TreeNode* new = (struct TreeNode*)malloc(sizeof(struct TreeNode));new->left = NULL;new->right = NULL;new->val = val;while (root) {if (root->val > val) {if (root->left != NULL)root = root->left;else {root->left = new;return ans;}} else {if (root->right != NULL)root = root->right;else {root->right = new;return ans;}}}return ans;
}

第二种

​ 递归法

  • 终止递归是如果遇到了空节点,则证明该位置就应该是插入位置,直接返回新节点接可以了;
  • 后面我们考虑一层递归的逻辑,我们判断val与root->val的大小关系,然后继续遍历左孩子节点或右孩子节点(之后会返回),并且用root->left或root->right接住返回值;
  • 最后返回root就可以了。

最后的代码是这样的:

struct TreeNode* insertIntoBST(struct TreeNode* root, int val) {if (root == NULL) {struct TreeNode* new =(struct TreeNode*)malloc(sizeof(struct TreeNode));new->left = NULL;new->right = NULL;new->val = val;return new;}if (val > root->val)root->right = insertIntoBST(root->right, val);if (val < root->val)root->left = insertIntoBST(root->left, val);return root;
}

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

题目

在这里插入图片描述

代码

struct TreeNode* Traval(int* nums, int left, int right) {if (left > right)return NULL;int mid = (left + right) / 2;struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode));root->val = nums[mid];root->left = Traval(nums, left, mid - 1);root->right = Traval(nums, mid + 1, right);return root;
}struct TreeNode* sortedArrayToBST(int* nums, int numsSize) {return Traval(nums, 0, numsSize - 1);
}

题解

本题要求我们将给定的升序数组转换成一棵平衡二叉搜索树。

我们的思路就是每次都将数组中的中间元素设置成根节点,然后将左边的设置为左子树,右边的设置为右子树,然后对左子树和右子树再进行相同的处理(运用递归)。

下面是代码:

struct TreeNode* Traval(int* nums, int left, int right) {if (left > right)return NULL;int mid = (left + right) / 2;struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode));root->val = nums[mid];root->left = Traval(nums, left, mid - 1);root->right = Traval(nums, mid + 1, right);return root;
}struct TreeNode* sortedArrayToBST(int* nums, int numsSize) {return Traval(nums, 0, numsSize - 1);
}

这里要说的是上面的终止条件(left>right),这里是因为我们传参是left和mid-1或者mid+1和right,如果left>right就证明节点为空,直接返回空节点就可以了。

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

题目
在这里插入图片描述

代码

struct TreeNode* deleteNode(struct TreeNode* root, int key){if(root==NULL)return NULL;if(root->val==key){if(root->left==NULL&&root->right==NULL)return NULL;else if(root->left==NULL&&root->right!=NULL)return root->right;else if(root->left!=NULL&&root->right==NULL)return root->left;else if(root->left!=NULL&&root->right!=NULL){struct TreeNode* cur=root->right;while(cur->left!=NULL)cur=cur->left;cur->left=root->left;return root->right;}}if(root->val>key)root->left=deleteNode(root->left,key);if(root->val<key)root->right=deleteNode(root->right,key);return root;
}

题解

本题我们在删除的地方有五种情况:

  • 第一种情况:没找到删除的节点,遍历到空节点直接返回了
  • 找到删除的节点
    • 第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点
    • 第三种情况:删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点
    • 第四种情况:删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
    • 第五种情况:左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。

如果我们搞清楚了这五种情况,我们运用递归很容易就可以实现这道题。

已经到底啦!!

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

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

相关文章

<计算机网络自顶向下> TCPUDP套接字编程

应用实现&#xff1a;源端的应用进程交换报文实现应用协议&#xff0c;来实现各种各样的网络应用&#xff08;dash&#xff0c;email, etc&#xff09; 而应用层通信不可以直接通信&#xff0c;需要借助下层的服务才可以进行&#xff0c;通过层间接口交给下层&#xff0c;通过…

基于java的社区生活超市管理系统

开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclip…

CSS常用十大选择器(理论+代码实操)

HTML代码实例 注意&#xff1a;拷贝后本地运行注意head标签中的link标签的href属性是否正确 我的目录结构&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>Title</title><lin…

详解拷贝构造

拷贝构造的功能 写法&#xff1a; 拷贝构造函数的参数为什么是引用类型 系统自动生成的拷贝构造函数 拷贝构造的深拷贝与浅拷贝 概念 浅拷贝&#xff1a; 深拷贝 小结 拷贝构造的功能 拷贝构造函数可以把曾经实例化好的对象的数据拷贝给新创建的数据 &#xff0c;可见…

ASP.NET基于BS的计算机等级考试系统的设计与实现

摘 要 随着计算机技术的发展及计算机的日益普及&#xff0c;基于B/S结构的考试系统与无纸化办公一样已成为大势所趋。论文详细论述了一个基于B/S结构的计算机等级考试系统的设计过程。软件采用ASP.NET 2005作开发平台&#xff0c;C#作编程语言&#xff0c;SQL Server 2005作…

【DNS】

文章目录 DNS域名解析系统&#xff08;Domain Name System&#xff09;DNS系统需要解决的问题DNS域名解析系统&#xff08;Domain Name System&#xff09;问题1&#xff1a;DNS名字空间(The DNS Name Space&#xff09;DNS名字空间(The DNS Name Space)DNS名字空间(The DNS Na…

边缘计算【智能+安全检测】系列教程--使用OpenCV+GStreamer实现真正的硬解码,完全消除马赛克

通过现有博客的GST_URL = "rtspsrc location=rtsp://admin:abcd1234@192.168.1.64:554/h264/ch01/main/av_stream latency=150 ! rtph264depay ! avdec_h264 ! videorate ! videoconvert ! appsink sync=false" GStreamer的解码方式解码,大多情况应该存在上图马赛克…

解决jenkins运行sh报process apparently never started in XXX

个人记录 问题 process apparently never started in /var/jenkins_home/workspace/ks-springboot_mastertmp/durable-bbfe5f99(running Jenkins temporarily with -Dorg.jenkinsci.plugins.durabletask.BourneShellScript.LAUNCH_DIAGNOSTICStrue might make the problem cl…

架构师系列-搜索引擎ElasticSearch(八)- 集群管理故障恢复

故障转移 集群的master节点会监控集群中的节点状态&#xff0c;如果发现有节点宕机&#xff0c;会立即将宕机节点的分片数据迁移到其它节点&#xff0c;确保数据安全&#xff0c;这个叫做故障转移。 下图中node1是主节点&#xff0c;其他两个节点是从节点 节点故障 此时node1…

卷积神经网络(LeNet5实现对Fashion_MNIST分类

参考6.6. 卷积神经网络&#xff08;LeNet&#xff09; — 动手学深度学习 2.0.0 documentation (d2l.ai) ps&#xff1a;在这里预备使用pythorch 1.对 LeNet 的初步认识 总的来看&#xff0c;LeNet主要分为两个部分&#xff1a; 卷积编码器&#xff1a;由两个卷积层组成; …

OLTP 与 OLAP 系统说明对比和大数据经典架构 Lambda 和 Kappa 说明对比——解读大数据架构(五)

文章目录 前言OLTP 和 OLAPSMP 和 MPPlambda 架构Kappa 架构 前言 本文我们将研究不同类型的大数据架构设计&#xff0c;将讨论 OLTP 和 OLAP 的系统设计&#xff0c;以及有效处理数据的策略包括 SMP 和 MPP 等概念。然后我们将了解经典的 Lambda 架构和 Kappa 架构。 OLTP …

振兴国腾GM8775C MIPIDSI桥接到双 PORT LVDS

GM8775C描述&#xff1a; GM8775C 型 DSI 转双通道 LVDS 发送器产品主要实现将 MIPI DSI 转单 / 双通道 LVDS 功能&#xff0c;MIPI 支持 1/2/3/4 通道可选&#xff0c;每通道最高支持 1Gbps 速率&#xff0c;最大支持 4Gbps 速率。LVDS 时钟频率高达 154MHz &a…

Vue列表渲染

一、Vue列表渲染 1.用 v-for 把一个数组对应为一组元素 我们可以用 v-for 指令基于一个数组来渲染一个列表。v-for 指令需要使用 item in items 形式的特殊语法&#xff0c;其中 items 是源数据数组&#xff0c;而 item 则是被迭代的数组元素的别名。 <ul id"exampl…

Facebook广告投放数据API对接流程

说明&#xff1a;仅供学习使用&#xff0c;请勿用于非法用途&#xff0c;若有侵权&#xff0c;请联系博主删除 作者&#xff1a;zhu6201976 一、需求背景 App在Facebook、Google等巨头进行广告投放&#xff0c;想要拿到实时广告投放效果数据&#xff0c;如曝光、点击、花费、触…

Django第三方功能的使用

Django第三方功能的使用 Django REST framework前言1、Django--Restframework--coreapi版文档BUG:AssertionError: coreapi must be installed for schema support.How to run Django with Uvicorn webserver?2、序列化类 Serializer的使用模型序列化类 ModelSerializer的使用…

MySQL 社区版 安装总结

很早就安装过MySQL&#xff0c;没有遇到过什么问题&#xff0c;直接next就行了&#xff0c;这次在新电脑上安装却遇到了一些问题&#xff0c;记录一下。 安装的是MySQL社区版&#xff0c;下载地址是www.mysql.com&#xff0c;进入后选择DOWNLOAD页面&#xff0c;选择MySQL Com…

SqlServer专题

目录 1&#xff0c;连接数据库 2&#xff0c;连接池 1.何为连接池&#xff1f; 2.连接池运行原理。 3.如何查看连接池&#xff1f; 4.连接池注意事项。 3&#xff0c;一般SQL语句。 4&#xff0c;控制语句 1.判断语句 2.循环语句 5&#xff0c;视图 1.使用…

<计算机网络自顶向下> P2P应用

纯P2P架构 没有或者极少一直运行的Server&#xff0c;Peer节点间歇上网&#xff0c;每次IP地址都可能变化任意端系统都可以直接通信利用peer的服务能力&#xff0c;可扩展性好例子&#xff1a;文件分发; 流媒体; VoIP类别:两个节点相互上载下载文件&#xff0c;互通有无&#…

C# Solidworks二次开发:相机访问相关API详解

大家好&#xff0c;今天要介绍的API为相机相关的API&#xff0c;这篇文章比较适合女孩子&#xff0c;学会了相机就会拍照了&#xff0c;哈哈。 下面是要介绍的API: &#xff08;1&#xff09;第一个为GetFocalDistance&#xff0c;这个API的含义为获取相机的焦距&#xff0c;…

ASP.NET基于BS的图书销售管理系统的设计与实现

随着Internet的兴起&#xff0c;网络已经成为现代人生活中的一部分&#xff0c;越来越多的人喜欢在网上交易。本系统就是一个基于B/S模式的网络化的图书销售管理系统,采用的是ASP.NET技术&#xff0c;实现了用户注册信息管理、用户信息管理、图书销售点管理、图书信息管理、客户…