当前位置: 首页 > news >正文

C语言手撕实战代码_二叉排序树(二叉搜索树)_构建_删除_插入操作详解

二叉排序树习题
1.设计算法构建一棵二叉排序树(又称二叉搜索树BST)
2.查找二叉排序树中结点为x的结点所在的层数
3.删除二叉排序树T中值为x的结点
4.查找二叉排序树中所有小于key的关键字
5.编写算法,将一棵二叉树t分解成两棵二叉排序树t1和t2,使得t1中的所有结点关键字的值都小于x,t2中所有结点关键字的值都大于x
6.已知二叉排序树中每一个结点值为整型,采用二叉链表存储,编写算法删除二叉排序树中所有关键字小于x的结点

文章目录

  • 1.设计算法构建一棵二叉排序树(又称二叉搜索树BST)
  • 2.查找二叉排序树中结点为x的结点所在的层数
  • 3.删除二叉排序树T中值为x的结点
  • 4.查找二叉排序树中所有小于key的关键字
  • 5.编写算法,将一棵二叉树t分解成两棵二叉排序树t1和t2,使得t1中的所有结点关键字的值都小于x,t2中所有结点关键字的值都大于x
  • 6.已知二叉排序树中每一个结点值为整型,采用二叉链表存储,编写算法删除二叉排序树中所有关键字小于x的结点

1.设计算法构建一棵二叉排序树(又称二叉搜索树BST)

二叉树搜索树的构建就是多个插入操作的重复使用,下面的代码并用二叉树的前序遍历检验插入结果。
二叉排序树,中序序列序列就变成了有序输出

#include <stdio.h>
#include <stdlib.h>typedef int ElemType;
typedef struct BiTNode
{ElemType data;struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;//二叉排序树的插入操作
void insertKey(BiTree &T,ElemType key)
{//if是根(子树根)节点的操作,else if是左右子树操作 根节点+左右子树的操作=问题的解if(T==NULL){BiTNode * p=(BiTNode *)malloc(sizeof(BiTNode));p->lchild=NULL;p->rchild=NULL;p->data=key;T=p;}else if(key<T->data)//如果key<当前结点{insertKey(T->lchild, key);}else if(key >T->data){insertKey(T->rchild, key);}
}BiTNode * creatBSTree()
{BiTNode *T=NULL;ElemType keyList[]={40,10,45,15};int keyListLength=4;for(int i=0;i<keyListLength;i++){insertKey(T, keyList[i]);}return T;
}void preOreder(BiTree T)
{if(T==NULL) return;printf("%d ",T->data);preOreder(T->lchild);preOreder(T->rchild);
}
int main()
{BiTree T=creatBSTree();preOreder(T);printf("\n");
}

2.查找二叉排序树中结点为x的结点所在的层数

我的思考?在上一节中,我们可以用层序遍历来完成这个事,但是那个是全部二叉树可用,这一次有什么区别
答:之前的二叉树要遍历完全部的结点,才能找到x。需要横着找
这次有序的寻找就不同了,是竖着找

int nodelevel=0;
int getNode(BiTree T,int x)
{if(T!=NULL){nodelevel++;if(x== T->data) return  nodelevel;else if(x<T->data){getNode(T->lchild, x);}else if(x>T->data){getNode(T->rchild, x);}}else nodelevel=0;//表明没有查到x,返回0return  nodelevel;
}

3.删除二叉排序树T中值为x的结点

找到值为x的结点,然后删除该点

在这里插入图片描述

我们这里以方法1为例子,右孩子,插入到左孩子的最大结点中
思路提炼:
关于存在两棵子树的时候,
找到左子树的最右子树(最大结点),它肯定没有右孩子,将待删除结点的右孩子变成它的右孩子,删掉待删除结点即可

void deleteopr(BiTree &T)
{//第一种情况,删除结点是根节点,第二种情况,只有一个子树,第三种情况,有两个子树if(T->lchild==NULL&&T->rchild==NULL){T=NULL;}else if(T->lchild!=NULL&&T->rchild!=NULL){BiTNode *pMax=T->lchild;while(pMax->rchild!=NULL){pMax=pMax->rchild;}pMax->rchild=T->rchild;BiTNode *p=T;T=T->lchild;free(p);}else         //只有一边有子树{//如果左边有子树if(T->lchild!=NULL){//记录被抛弃的结点的存储空间,用完它之后就给他free掉BiTNode *p=T;T=T->lchild;free(p);}else{BiTNode *p=T;T=T->rchild;free(p);}}
}
void delete_treeNode(BiTree &T,ElemType x)
{if(T->data==x){//删除这个结点,删除操作开始,否则的话,就继续往左右子树里寻找这个结点deleteopr(T);}else if(x<T->data){delete_treeNode(T->lchild, x);}else if(x>T->data){delete_treeNode(T->rchild, x);}
}

4.查找二叉排序树中所有小于key的关键字

思路:二叉排序树中序遍历是有序的,所以在中序遍历的过程中就能找到全部小于key的结点,中止中序遍历就行。

简单代码已省略

5.编写算法,将一棵二叉树t分解成两棵二叉排序树t1和t2,使得t1中的所有结点关键字的值都小于x,t2中所有结点关键字的值都大于x

思路:

6.已知二叉排序树中每一个结点值为整型,采用二叉链表存储,编写算法删除二叉排序树中所有关键字小于x的结点

错误思路:是以为找到某点小于x,就把它连同它的左子树全部删除,若它存在右子树,就让它右子树代替它。这种思路就漏解了,漏掉了小于结点的右子树中,仍可能存在小于x的结点。

在这里插入图片描述

明确使用哪种遍历?-使用前序遍历,因为根节点是划分区间的依据,只有使用前序遍历,我们才能够先拿到根结点。
根右左

void deleteFunc(BiTree &T) //删除一整棵树,先删除左子树,再删除右子树,最后删除根节点,就不用保存根节点的信息了
{if(T!=NULL){deleteFunc(T->lchild);deleteFunc(T->rchild);free(T);T = NULL; // 避免悬空指针,直接将T设为NULL,已经释放掉的指针}
}void preOrderTraversing(ElemType x,BiTree &T)
{//如果树不为空if(T!=NULL){if(T->data==x)  //如果当前正正好好,T的左子树小于x,T的右子树大于x,那么删除左子树即可{//deleteFunc(T->lchild);  //删除函数,删除了T的左孩子T->lchild=NULL;}else if(x>T->data) //如果当前x大于该结点,那么该结点的左孩子肯定都比x小,需要删除,右孩子中可能存在着小于x的值,所以右孩子要递归{//递归删除右子树preOrderTraversing(x,T->rchild);//删除左子树和根节点,这里注意删除根节点的时候,它可能存在右孩子,所以要让指针指向他的右孩子,我们保存根节点信息,直接让指针指向其右孩子BiTNode* p=T;T=T->rchild;p->rchild=NULL;   //右子树置空,为什么要把右子树置空,要切断它指针的联系,因为现在的右子树已经是新的根节点了,如果不把老的根节点的右子树置空,删除操作的时候,会把右子树也删除了//deleteFunc(p);  //删除根节点和它的左孩子}else if(x<T->data) //如果当前x小于该结点,那么该结点的右孩子肯定都比x大,左孩子中可能存在着小于x的值,所以左孩子要递归{//右子树不用管,处理它的左子树就行preOrderTraversing(x,T->lchild);}}
}

相关文章:

C语言手撕实战代码_二叉排序树(二叉搜索树)_构建_删除_插入操作详解

二叉排序树习题1.设计算法构建一棵二叉排序树(又称二叉搜索树BST)2.查找二叉排序树中结点为x的结点所在的层数3.删除二叉排序树T中值为x的结点4.查找二叉排序树中所有小于key的关键字5.编写算法&#xff0c;将一棵二叉树t分解成两棵二叉排序树t1和t2&#xff0c;使得t1中的所有…...

YC教父的创始人模式VS职业经理人模式:AI时代的独立开发者崛起

近年来&#xff0c;由风投资助的创始人模式因其相对较低的入门门槛而在创业圈内广受欢迎。然而&#xff0c;真正的挑战在于独立开发者&#xff08;一人商业&#xff09;模式。随着AI技术的飞速发展&#xff0c;一人商业模式有望成为未来的主流。本文将探讨独立开发者的工作范围…...

[SUCTF 2019]Pythonginx

给了源码 app.route(/getUrl, methods[GET, POST]) def getUrl():url request.args.get("url")host parse.urlparse(url).hostnameif host suctf.cc:return "我扌 your problem? 111"parts list(urlsplit(url))host parts[1]if host suctf.cc:retu…...

省市县相关校验sql随笔

1.层级校验 要判断一个给定的省、市、区&#xff08;县&#xff09;名字是否符合正确的层级关系,假设你的表结构如下&#xff1a; CREATE TABLE regions (id INT PRIMARY KEY,name VARCHAR(255),parent_id INT, -- 指向上一级区域的id&#xff0c;例如市的parent_id指向省的…...

uniapp ios sticky定位,内部 u-tabs(包含scroll-view)消失问题

uniapp中用sticky定位时&#xff0c;元素内部如果有scroll-view&#xff0c;ios在触发bounce机制时&#xff0c;scroll-view的元素会消失&#xff0c;解决方法是页面上包一层高度为100vh的scroll-view <scroll-view style"height: 100vh;" scroll-y scrolltolowe…...

web群集--nginx配置文件location匹配符的优先级顺序详解及验证

文章目录 前言优先级顺序优先级顺序(详解)1. 精确匹配&#xff08;Exact Match&#xff09;2. 正则表达式匹配&#xff08;Regex Match&#xff09;3. 前缀匹配&#xff08;Prefix Match&#xff09; 匹配规则的综合应用验证优先级 前言 location的作用 在 NGINX 中&#xff0…...

Vivado编译报错黑盒子问题

1 问题描述 “Black Box Instances: Cell **** of type ** has undefined contents and is considered a back box. The contents of this cell must be defined for opt_design to complete successfully.” 检查工程代码提示的模块&#xff0c;该模块为纯手写的Veril…...

【建造者模式】

建造者模式 Builder Pattern 属于创建型模式是将一个复杂对象的构建与它的标识分离&#xff0c;使得同样的构建过程可以创建不同的表示关键点&#xff1a;用户只需要指定需要建造的类型就可以获得对象&#xff0c;建造过程及细节不需要了解 实现 demo 需要构建的对象 Data pu…...

自动化表格处理的革命:智能文档系统技术解析

在当今数据驱动的商业环境中&#xff0c;表格数据的自动化处理成为了企业提高效率、降低成本的关键。企业智能文档系统在智能表格识别方面展现出卓越的性能&#xff0c;通过精准识别和处理各种通用表格&#xff0c;显著提升了企业文档管理的智能化水平。本文将深入探讨该系统在…...

【Hot100】LeetCode—394. 字符串解码

目录 1- 思路栈实现四种情况处理 2- 实现⭐394. 字符串解码——题解思路 3- ACM 实现 原题链接&#xff1a;394. 字符串解码 1- 思路 栈实现四种情况处理 ① 遇到数字&#xff0c;进行倍数相加 、②遇到左括号&#xff0c;压栈之前的元素、③遇到右括号弹出&#xff0c;栈进行…...

12. 如何在MyBatis中进行分页查询?常见的分页实现方式有哪些?

在MyBatis中&#xff0c;分页查询是一种常见的需求&#xff0c;尤其是在处理大数据量的情况下。MyBatis本身不直接提供分页功能&#xff0c;但可以通过以下几种常见的实现方式来实现分页查询。 1. 手动分页 这是最基本的分页方式&#xff0c;直接在SQL语句中添加分页参数。不同…...

@[TOC](力扣题目-滑动窗口-qsort排序-二分法查找)

通信 LCR 009. 乘积小于 K 的子数组268. 丢失的数字287. 寻找重复数 LCR 009. 乘积小于 K 的子数组 已解答 滑动窗口 给定一个正整数数组 nums和整数 k &#xff0c;请找出该数组内乘积小于 k 的连续的子数组的个数。 示例 1: 输入: nums [10,5,2,6], k 100 输出: 8 解释…...

Docker容器相关命令

Docker是一种容器化技术&#xff0c;可以帮助用户更轻松地创建、部署和管理容器。下面是一些常见的Docker容器管理任务&#xff1a; 创建容器&#xff1a;使用Docker镜像创建一个新的容器。 docker run image_name列出容器&#xff1a;查看当前运行的容器列表。 docker ps启动容…...

【老课推荐】基于LangChain和知识图谱的大模型医疗问答机器人项目

在当今数据驱动和人工智能主导的时代&#xff0c;大模型和知识图谱的结合是一个重要的研究和应用方向。大模型实战课程通过48课时&#xff0c;分为六个主要章节&#xff0c;涵盖了从基本概念到高级应用的多方面内容。学员将通过本课程学习如何使用LangChain和OpenAI进行开发&am…...

Adobe Sensei——自动化视频编辑、特效应用和素材增强,通过AI技术快速优化视频内容,自动修复视频质量、自动添加背景音乐或字幕

一、Adobe Sensei介绍 Adobe Sensei 是 Adobe 公司开发的一款基于人工智能和机器学习技术的平台&#xff0c;旨在增强其各种创意、文档和体验管理工具。Adobe Sensei 通过深度学习、计算机视觉、自然语言处理&#xff08;NLP&#xff09;等先进技术&#xff0c;帮助用户在 Ado…...

【AIGC数字人】EchoMimic:基于可编辑关键点条件的类人音频驱动肖像动画

GitHub&#xff1a;https://github.com/BadToBest/EchoMimic 论文&#xff1a; https://arxiv.org/pdf/2407.08136 comfyui&#xff1a; https://github.com/smthemex/ComfyUI_EchoMimic 相关工作 Wav2Lip Wav2Lip是一个开创性的工作 &#xff0c;但输出会出现面部模糊或扭…...

变量数据类型 Day3

1. 变量 1.1 变量的概念 变量是计算机内存中的一块存储单元&#xff0c;是存储数据的基本单元变量的组成包括&#xff1a;数据类型、变量名、值&#xff0c;后文会具体描述变量的本质作用就是去记录数据的&#xff0c;比如说记录一个人的身高、体重、年龄&#xff0c;就需要去…...

SpringBoot2:请求处理原理分析-RESTFUL风格接口

一、RESTFUL简介 Rest风格支持&#xff08;使用HTTP请求方式&#xff0c;动词来表示对资源的操作&#xff09; 以前&#xff1a;/getUser 获取用户 /deleteUser 删除用户 /editUser 修改用户 /saveUser 保存用户 现在&#xff1a; /user GET-获取用户 DELETE-删除用户 PUT-修改…...

[Linux][配置]Linux修改history存储的最大记录数

Linux修改History最大记录为20000行 sed -i s/^HISTSIZE1000/HISTSIZE20000/ /etc/profile source /etc/profile 在 Linux 系统中&#xff0c;HISTSIZE 环境变量用于定义历史记录的大小&#xff0c;即在终端中可以回溯的命令数量。默认情况下&#xff0c;这个值通常是 1000&…...

代码随想录 刷题记录-28 图论 (5)最短路径

一、dijkstra&#xff08;朴素版&#xff09;精讲 47. 参加科学大会 思路 本题就是求最短路&#xff0c;最短路是图论中的经典问题即&#xff1a;给出一个有向图&#xff0c;一个起点&#xff0c;一个终点&#xff0c;问起点到终点的最短路径。 接下来讲解最短路算法中的 d…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...