C语言二叉排序树左旋,C语言数据结构二叉排序算法(二叉排序树)

/*二叉排序树的相关操作

*二叉排序树的创建使用二级指针

*顺序表的创建 顺序表的数据递增排序

*对树的节点的数据进行赋值操作

*利用二分查找法进行二叉排序树的创建(递归实现二叉排序树的创建)

*对数据进行查找 (递归实现)

*对数据进行插入

*/

#include

#include

#include

#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 seqlist

{

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_seqlist(SeqList *s);//顺序表的初始化

void creat_seqlist(SeqList*s);//顺序表的创建

void sort_seqlistdata(SeqList*s);//对顺序表的元素进行递增排序

void Init_binarytree(TreeNode**tree);//对二叉树的根节点进行初始化

void creat_binarytree(TreeNode**tree,SeqList *s,int L,int H);

//利用二分查找法的规则进行二叉排序树的创建

void Inorder_traverse(TreeNode*node);//对二叉排序树进行递增遍历

void search_treenode(TreeNode*tree,int key,TreeNode**node);//查找指定节点数据函数

//查找数据 返回数据所在的指针位置 为空代表没有找到

void Insert_node(TreeNode**tree,ElementType ele);//在合适位置处插入节点 继续保持有序

void test();//测试函数

void main()

{

test();//测试函数

}

void Init_seqlist(SeqList *s)//顺序表的初始化

{

s->datas=(ElementType*)malloc(sizeof(ElementType)*MAX_SIZE);

s->length=0;//对顺序表的长度进行初始化

}

void creat_seqlist(SeqList*s)//顺序表的创建

{

int keys[]={12,54,89,99,21};

int i;//循环变量

char*values[]={"c语言","c++","c#","java","JavaScript"};

int len=sizeof(keys)/sizeof(keys[0]);

for(i=0;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_seqlistdata(SeqList*s)

{

int i=s->length-1;//比较的轮数

int j;

int flag;

ElementType t;

while(flag)

{

flag=0;//结束for循环的标志

for(j=0;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;

}

(*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_traverse(TreeNode*node)

{

if(node!=NULL)

{

Inorder_traverse(node->Lchild);

printf("[%d,%s]->",node->data.key,node->data.value);

Inorder_traverse(node->Rchild);

}

}

void test()//测试函数

{

SeqList*s;

int i;

TreeNode*node;

ElementType data;//插入元素的结构体

int key;//待查找的数据

TreeNode*tree;

Init_seqlist(s);

Init_binarytree(&tree);

//创建顺序表

creat_seqlist(s);

sort_seqlistdata(s);

printf("顺序表遍历的结果为:\n");

for(i=0;ilength;i++)

printf("%d %s\n",s->datas[i].key,s->datas[i].value);

creat_binarytree(&tree,s,0,s->length-1);

printf("二叉排序树遍历的结果为:\n");

Inorder_traverse(tree);

printf("\n");//换行

printf("请输入要查询的数据:\n");

scanf("%d",&key);

search_treenode(tree,key,&node);

if(node==NULL)

{

printf("查找数据失败:\n");

}

else

{

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);

strcpy(data.value,"pathon");

//printf("data的数据为:%d %s",data.key,data.value);

Insert_node(&tree,data);

printf("插入后的遍历的结果为:\n");

Inorder_traverse(tree);

}

void search_treenode(TreeNode*tree,int key,TreeNode**node)

//当找到时node的指针指的是数据的地址 否则返回为空指针

{

if(tree==NULL||tree->data.key==key)

*node=tree;//包括找到和没找到的情况

else if(key>tree->data.key)

{

search_treenode(tree->Rchild,key,node);

}

else

{

search_treenode(tree->Lchild,key,node);

}

}

void Insert_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;

}

else if (ele.keydata.key)

{

Insert_node(&(*tree)->Lchild,ele);

}

else if(ele.key>(*tree)->data.key)

{

Insert_node(&(*tree)->Rchild,ele);

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值