C语⾔数据结构⼆叉排序算法(⼆叉排序树)
/*⼆叉排序树的相关操作
*⼆叉排序树的创建使⽤⼆级指针
*顺序表的创建 顺序表的数据递增排序
*对树的节点的数据进⾏赋值操作
*利⽤⼆分查找法进⾏⼆叉排序树的创建(递归实现⼆叉排序树的创建)
*对数据进⾏查找 (递归实现)
*对数据进⾏插⼊
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_SIZE 1024 //顺序表的节点的个数
#define MAX_NAME 255 //字符串的最⼤长度
#define OK 1
#define ERROR 0
typedef int Statu;//返回值的数据类型
typedef int KeyType;//关键字的数据类型
typedef char* Value_Type;//表节点的名称标记
typedef struct element
{
KeyType key;//关键字
Value_Type value;//标志名称
}ElementType;//顺序表的数据节点的结构体
typedef struct qlist
{
ElementType *datas;//顺序表的数组(指针类型)
int length;//顺序表的长度
}SeqList;//顺序表的结构体类型
typedef struct treenode
{
ElementType data;
struct treenode *Lchild;//左孩⼦节点
struct treenode *Rchild;//右孩⼦节点
脏话英文
}TreeNode;//⼆叉排序树结构体
#define fun(M) M=(TreeNode*)malloc(sizeof(TreeNode));
void Init_qlist(SeqList *s);//顺序表的初始化
void creat_qlist(SeqList*s);//顺序表的创建
void sort_qlistdata(SeqList*s);//对顺序表的元素进⾏递增排序
void Init_binarytree(TreeNode**tree);//对⼆叉树的根节点进⾏初始化
void creat_binarytree(TreeNode**tree,SeqList *s,int L,int H);
//利⽤⼆分查找法的规则进⾏⼆叉排序树的创建
void Inorder_traver(TreeNode*node);//对⼆叉排序树进⾏递增遍历
void arch_treenode(TreeNode*tree,int key,TreeNode**node);//查找指定节点数据函数
/
/查找数据返回数据所在的指针位置为空代表没有找到
void Inrt_node(TreeNode**tree,ElementType ele);//在合适位置处插⼊节点继续保持有序
void test();//测试函数
void main()
{
fulfilltest();//测试函数
}
void Init_qlist(SeqList *s)//顺序表的初始化
{
s->datas=(ElementType*)malloc(sizeof(ElementType)*MAX_SIZE);
s->length=0;//对顺序表的长度进⾏初始化
}
void creat_qlist(SeqList*s)//顺序表的创建
{
int i;//循环变量
char*values[]={"c语⾔","c++","c#","java","JavaScript"};
int len=sizeof(keys)/sizeof(keys[0]);
for(i=0;i<len;i++)
{
s->datas[i].key=keys[i];
s->datas[i].value=(Value_Type)malloc(sizeof(char)*MAX_NAME);
strcpy(s->datas[i].value,values[i]);s-
s->length++;
}
}
void sort_qlistdata(SeqList*s)
{
int i=s->length-1;//⽐较的轮数
int j;
int flag;
ElementType t;
while(flag)
{
flag=0;//结束for循环的标志
for(j=0;j<i;j++)
{
if(s->datas[j].key>s->datas[j+1].key)
{//交换数据
t=s->datas[j];
s->datas[j]=s->datas[j+1];
s->datas[j+1]=t;
flag=1;
}
}
i--;//⽐较的轮数减⼀
}
}
void Init_binarytree(TreeNode**tree)//对⼆叉树的根节点进⾏初始化
{
(*tree)=(TreeNode*)malloc(sizeof(TreeNode));
(*tree)->Lchild=NULL;//对根节点进⾏初始化操作
(*tree)->Rchild=NULL;
}
void creat_binarytree(TreeNode**tree,SeqList *s,int L,int H)//利⽤⼆级指针创建操作(){
int M=(L+H)/2;
if(L>H)
return ;//当节点的数据为空时退出循环
//创建⼀个⼆叉排序树
//根据⼆分法创建⼀个⼆叉排序树
if((*tree)==NULL)//根节点为空对根节点再次进⾏初始化
{
(*tree)=(TreeNode*)malloc(sizeof(TreeNode));
(*tree)->Lchild=NULL;
(*tree)->Rchild=NULL;
}
行尸走肉第四季11(*tree)->data.key=s->datas[M].key;
(*tree)->data.value=(Value_Type)malloc(sizeof(char)*10);
strcpy((*tree)->data.value,s->datas[M].value);
//创建左孩⼦节点
creat_binarytree(&((*tree)->Lchild),s,L,M-1);//使⽤⼆级指针
//创建右孩⼦节点
creat_binarytree(&((*tree)->Rchild),s,M+1,H);
}
void Inorder_traver(TreeNode*node)
{
if(node!=NULL)
Inorder_traver(node->Lchild);
printf("[%d,%s]->",node->data.key,node->data.value);
Inorder_traver(node->Rchild);
}
}
void test()//测试函数
{
SeqList*s;
int i;
TreeNode*node;
ElementType data;//插⼊元素的结构体
int key;//待查找的数据
TreeNode*tree;
Init_qlist(s);
Init_binarytree(&tree);
//创建顺序表
creat_qlist(s);
sort_qlistdata(s);
yieldprintf("顺序表遍历的结果为:\n");
for(i=0;i<s->length;i++)
printf("%d %s\n",s->datas[i].key,s->datas[i].value);
creat_binarytree(&tree,s,0,s->length-1);
printf("⼆叉排序树遍历的结果为:\n");
Inorder_traver(tree);
printf("\n");//换⾏
printf("请输⼊要查询的数据:\n");
scanf("%d",&key);
arch_treenode(tree,key,&node);
if(node==NULL)
{
printf("查找数据失败:\n");
}
el
{
printf("查询成功\n");
printf("查找的数据为[%d,%s]\n",node->data.key,node->data.value); }
printf("\n");
printf("请输⼊要插⼊的数据:\n");
scanf("%d",&(data.key));
data.value=(Value_Type)malloc(sizeof(char)*20);global forest watch
strcpy(data.value,"pathon");
//printf("data的数据为:%d %s",data.key,data.value);
competitionInrt_node(&tree,data);
printf("插⼊后的遍历的结果为:\n");
Inorder_traver(tree);
}
void arch_treenode(TreeNode*tree,int key,TreeNode**node)
//当找到时node的指针指的是数据的地址否则返回为空指针
{
if(tree==NULL||tree->data.key==key)
struct*node=tree;//包括找到和没找到的情况
el if(key>tree->data.key)
{caption
arch_treenode(tree->Rchild,key,node);
}
el
{
arch_treenode(tree->Lchild,key,node);
}
void Inrt_node(TreeNode**tree,ElementType ele)//在合适位置处插⼊节点继续保持有序{
if(*tree==NULL)//创建该节点的空间
{
/* tree=(TreeNode*)malloc(sizeof(TreeNode));
//fun(tree);
tree->Lchild=NULL;
tree->Rchild=NULL;
tree->data=ele;//创建空间进⾏赋值操作
printf("[%d,%s]",tree->data.key,tree->data.value);*/
TreeNode*newnode=(TreeNode*)malloc(sizeof(TreeNode));
newnode->Lchild=NULL;
希望英语单词newnode->Rchild=NULL;
newnode->data=ele;
*tree=newnode;
}
el if (ele.key<(*tree)->data.key)
{
自学网视频教程Inrt_node(&(*tree)->Lchild,ele);
}
el if(ele.key>(*tree)->data.key)
{
Inrt_node(&(*tree)->Rchild,ele);
}
}