数据结构---二叉搜索树

数据结构—二叉搜索树

原理:参考趣学数据结构

代码:

队列代码:

#pragma once
#define N 100
#define elemType bstTree*
#include<stdlib.h>
typedef struct bstTree {int data;struct bstTree* lchild, *rchild;
}bstTree;
typedef struct dQueue {elemType data;struct dQueue* next;
}dQueue;
typedef struct queue {dQueue *front, *rear;
}queue;
bool initQueue(queue &Queue) {//初始化队列//Queue.front = new dQueue;Queue.front = Queue.rear = (dQueue*)malloc(sizeof(dQueue));if (!Queue.front) {return false;}Queue.front->next = NULL;//头结点return true;
}
elemType getQueueTopElem(queue &Queue) {//获取队列队头的元素elemType u=NULL ;if (Queue.front != Queue.rear) {dQueue* p = Queue.front->next;u = p->data;}return u;
}
bool enQueue(queue &Queue, elemType e) {//入队dQueue* p = Queue.rear;dQueue* s = (dQueue*)malloc(sizeof(dQueue));s->data = e;s->next = NULL;p->next = s;Queue.rear = s;return true;
}
bool deQueue(queue &Queue, elemType &e) {//出队if (Queue.front == Queue.rear) {return false;//空队}dQueue* p = Queue.front->next;e = p->data;Queue.front->next = p->next;if (p == Queue.rear) {//队尾只有一个元素的时候Queue.rear = Queue.front;}delete p;return true;
}
bool emptyQueue(queue Queue) {//队列为空的判断if (Queue.front == Queue.rear) {return true;}return false;
}

删除结点和四种(前序、中序、后序、层次)树的结点遍历:

#include<stdio.h>
#include<stdlib.h>
#include"queue.h"
void createBSTTree(bstTree* & T,int data) {//创建二叉排序树bstTree *p = NULL;if (!T) {p = (bstTree*)malloc(sizeof(bstTree));p->data = data;p->lchild = p->rchild = NULL;T = p;return;}if (data < T->data) {//左子树插入createBSTTree(T->lchild,data);}else {//右子树插入createBSTTree(T->rchild,data);}
}
void prePrint(bstTree*  BSTTree) {//前序遍历二叉排序树if (BSTTree) {printf("%d ", BSTTree->data);prePrint(BSTTree->lchild);prePrint(BSTTree->rchild);}
}
void midPrint(bstTree*  BSTTree) {//中序遍历二叉排序树if (BSTTree) {midPrint(BSTTree->lchild);printf("%d ", BSTTree->data);midPrint(BSTTree->rchild);}
}
void lastPrint(bstTree*  BSTTree) {//后序遍历二叉排序树if (BSTTree) {lastPrint(BSTTree->lchild);lastPrint(BSTTree->rchild);printf("%d ", BSTTree->data);}
}
void layerPrint(bstTree*  BSTTree) {//层次遍历二叉排序树printf("\n层次遍历二叉排序树:");queue Queue;initQueue(Queue);if (!BSTTree) {return;}enQueue(Queue, BSTTree);//入队while(!emptyQueue(Queue)) {//队列不为空时bstTree* e1 = getQueueTopElem(Queue),*e;deQueue(Queue, e);printf("%d ", e1->data);if (e1->lchild) {enQueue(Queue, e1->lchild);}if (e1->rchild) {enQueue(Queue, e1->rchild);}}printf("\n");
}
void deleteElemBSTTree(bstTree* &T, int e) {//删除元素ebstTree *f=NULL, *p=T, *q,*s;//f指向p当前指向结点的父节点if (!T) {return;}//查找元素ewhile (p) {if (p->data == e) {break;}f = p;if (p->data < e) {p = p->lchild;//左查找}else {p = p->rchild;//右查找}}if (!p) {//查找失败printf("\n没有要删除的元素%d\n", e);return;}if ((p->lchild)&&(p->rchild)) {//如果左右子树都不为空q = p->lchild;s = q;while (q->rchild) {s = q;q = q->rchild;}p->data = q->data;if (s != q) {s->rchild = q->lchild;}else {p->lchild=q->lchild;p = q;}delete q;}else {//其他情况,左孩子或右孩子为空,或者左右孩子都为空q = p;if (!p->lchild) {//左孩子为空p = p->rchild;}else if (!p->rchild) {//右孩子为空p = p->lchild;}if (!f) {//根节点的左孩子为空或者右孩子为空,或者左右孩子都为空T=p;}else if (f->lchild == q) {f->lchild = p;//f父节点的作用来了,起连接跳跃要删除结点的功能}else {f->rchild = p;}delete q;//一定要记得删除}
}
int main() {bstTree* T=NULL;//一定要初始化为空树int count,data;printf("开始构造二叉排序树:\n输入二叉排序树结点的数目:");scanf_s("%d", &count);while (count--) {//构造二叉排序树printf("输入二叉排序树的第%d个结点:",count+1);scanf_s("%d", &data);createBSTTree(T,data);}printf("前序遍历二叉排序树\n");prePrint(T);//前序遍历二叉排序树printf("\n");printf("中序遍历二叉排序树\n");midPrint(T);//中序遍历二叉排序树printf("\n");printf("后序遍历二叉排序树\n");lastPrint(T);//后序遍历二叉排序树printf("\n");layerPrint(T);//层次遍历二叉排序树printf("\n");int delElem;int counts = 2;while (counts--) {printf("删除元素:");scanf_s("%d", &delElem);deleteElemBSTTree(T, delElem);}printf("删除元素后的遍历如下:\n");printf("前序遍历二叉排序树\n");prePrint(T);//前序遍历二叉排序树printf("\n");printf("中序遍历二叉排序树\n");midPrint(T);//中序遍历二叉排序树printf("\n");printf("后序遍历二叉排序树\n");lastPrint(T);//后序遍历二叉排序树printf("\n");layerPrint(T);//层次遍历二叉排序树printf("\n");system("pause");return 0;
}

测试截图:

在这里插入图片描述

删除元素的时间复杂度O(logn),空间复杂度为O(1)

如果存在什么问题,欢迎批评指正!谢谢!

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

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

相关文章

《ASP.NET Core 微服务实战》-- 读书笔记(第10章)

第 10 章 应用和微服务安全云应用意味着应用运行所在的基础设施无法掌控&#xff0c;因此安全不能再等到事后再考虑&#xff0c;也不能只是检查清单上毫无意义的复选框由于安全与云原生应用密切相关&#xff0c;本章将讨论安全话题&#xff0c;并用示例演示几种保障 ASP.NET Co…

里加一列为1_9月1号新宠物食品法规实施啦,辣鸡宠物食品遭殃,你也可能违法...

大家好啊&#xff0c;今天是2019年9月1号&#xff0c;对于宠物行业其实是一个非常特别的日子今天宠物饲料管理办法正式实施加上2019年1月1号实施的宠物饲料卫生规定以及2015年3月8号实施的全价宠物食品 犬粮&#xff0c;猫粮标准中国的所有的猫狗宠物食品在今天有法可依&#x…

[蓝桥杯2016初赛]凑算式-dfs,next_permutation

代码如下&#xff1a; #include <iostream> using namespace std; const int N 15; bool st[N]; double a[N];int cnt; void dfs(int u) {if (u 10) {if (a[1] a[2] / a[3] (a[4] * 100 a[5] * 10 a[6]) / (a[7] * 100 a[8] * 10 a[9]) 10) {cnt;}}for (int i …

word List 12

word List 12 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

软硬件协同编程 - C#玩转CPU高速缓存(附示例)

写在前面好久没有写博客了&#xff0c;一直在不断地探索响应式DDD&#xff0c;又get到了很多新知识&#xff0c;解惑了很多老问题&#xff0c;最近读了Martin Fowler大师一篇非常精彩的博客The LMAX Architecture&#xff0c;里面有一个术语Mechanical Sympathy&#xff0c;姑且…

python操作excel_使用Python操作Excel时必学的3个库

Python对Excel的操作我主要用xlwt、xlrd、xlutils这三个库。1、xlwt主要用来创建并写入数据到Excel。已经存在的表不可以写入。以下使用Python写九九乘法表到Excel运行之后&#xff0c;代码文件所在的文件夹会多出一个”九九乘法表“的Excel&#xff0c;内容如下图&#xff1a;…

线性代数---线性方程组

线性代数—线性方程组 常见题型的解题技巧 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

gRPC in ASP.NET Core 3.x -- Protocol Buffer, Go语言的例子(下)

前两篇文章半年前写的&#xff1a;gRPC in ASP.NET Core 3.0 -- Protocol Buffer&#xff08;1&#xff09;&#xff0c;gRPC in ASP.NET Core 3.0 -- Protocol Buffer&#xff08;2&#xff09;这是上一篇&#xff1a;gRPC in ASP.NET Core 3.x -- Protocol Buffer, Go语言的例…

得到选择框句柄 怎么操作_知道借名买房有风险,只能选择借名买房该怎么操作?...

文/楼市大家谈(quanadcom)正常情况下&#xff0c;购房者买房之时最看重房子的产权&#xff0c;因此无论是签订购房合同还是办理房产证时&#xff0c;最为在意的都是以谁的名义买房&#xff0c;房子究竟记在谁的名下&#xff0c;但是在有些情况下&#xff0c;一些人迫于无奈&…

数据结构---平衡二叉树

数据结构—平衡二叉树 原理&#xff1a;参考趣学数据结构 代码&#xff1a; #include<stdio.h> #include<stdlib.h> typedef struct avlTree {int data;struct avlTree *lchild, *rchild;int height; }avlTree;int height(avlTree* AVLTree);//声明avl树的深度 …

python list转换成array_一文掌握Python【不定期更新】

目录一、Numpy1 基本操作2 随机数3 打乱训练数据4 得到元素的最值5 拼接数组6 得到函数的信息7 得到累乘即各项相乘的结果8 判断一个数是否在数组中9 数组的变换10 排序11 元素的筛选12.保存文件/打开文件13.限制范围二、PIL1.安装2.PIL与Numpy的互相转化3.获取Image信息4.打开…

开源netcore前后端分离,前端服务端渲染方案

SPA单页面应用容器 开源地址&#xff1a; https://github.com/yuzd/Spa功能介绍前端应用开发完后打包后自助上传部署发布配合服务端脚本(javascript)实现服务端业务逻辑编写渲染SSR功能可以快速回滚到上一个版本可以设置环境变量供SSR功能使用服务端脚本提供执行日志 redis db三…

[蓝桥杯2016初赛]方格填数-next_permutation

代码如下&#xff1a; #include <iostream> #include <algorithm> using namespace std;int main() {int a[10] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};int cnt 0;do {if ((abs(a[0] - a[1]) ! 1) && (abs(a[1] - a[2]) ! 1) && (abs(a[3] - a[4]) ! …

word List 13

word List 13 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

ASP.NetCore+VUE 实现学生成绩管理系统(一)

周三陪伴是最长情的告白还有两天情人节&#xff1a;「无论是在家里&#xff0c;还是在工作&#xff0c;或者是在自我防护中&#xff0c;多给家人爱人发句平安&#xff0c;是最有心意、最重要的一件事。」♥感谢老李????近来一段时间一直没有学习新的东西&#xff0c;闲暇的…

下拉菜单实现树状结构_树形图:复杂层次结构的数据可视化

树形图&#xff1a;复杂层次结构的数据可视化作者&#xff1a;Page Laubheimer[1]树形图是一种复杂的&#xff0c;基于区域的数据可视化&#xff0c;用于复杂层次结构的数据&#xff0c;可能难以精确解释。在许多情况下&#xff0c;最好使用更简单的可视化效果&#xff08;例如…

[蓝桥杯2016决赛]路径之谜

题目描述 小明冒充X星球的骑士&#xff0c;进入了一个奇怪的城堡。城堡里边什么都没有&#xff0c;只有方形石头铺成的地面。 假设城堡地面是 n x n 个方格。 按习俗&#xff0c;骑士要从西北角走到东南角。可以横向或纵向移动&#xff0c;但不能斜着走&#xff0c;也不能跳跃…

数据结构---二叉平衡排序树的删除

数据结构—二叉平衡排序树的删除 原理&#xff1a;参考趣学数据结构 代码&#xff1a; #include<stdio.h> #include<stdlib.h> typedef struct avlTree {int data;struct avlTree *lchild, *rchild;int height; }avlTree;int height(avlTree* AVLTree);//声明av…

Magicodes.IE 2.0发布

Magicodes.IE是我们维护的开源的导入导出通用库&#xff0c;去年年底已加入NCC开源组织。Github地址&#xff1a;https://github.com/xin-lai/Magicodes.IEMagicodes.IE不是一蹴而就&#xff0c;而是根据实际需求不断迭代出来的&#xff0c;而且历经多次重构。这一次&#xff0…

《ASP.NET Core 微服务实战》-- 读书笔记(第11章)

第 11 章 开发实时应用和服务在本章&#xff0c;我们将讨论“实时”的准确含义&#xff0c;以及在大部分消费者看来应该属于这一范畴的应用类型接着&#xff0c;我们将探讨 WebSocket&#xff0c;并分析为什么传统的 WebSocket 与云环境完全不相适应&#xff0c;最后我们将构建…