/***************************************************/
/* Description:树表的查找_二叉排序树的基本操作(C语言源代码)
/* Date:2021/9/2
/* Author:汝南城
/****************************************************/
#include<stdio.h>
#include<stdlib.h>
//#define MAXSIZE 100
/*二叉排序树的二叉链表存储方式*/
typedef struct
{
int key;
char name[20];
char num[10]; /*假装能用得到*/
}ElemType;
typedef struct BSTNode
{
ElemType data;
struct BSTNode* lchild, * rchild;
}BSTNode,*BSTree;
/*①二叉排序树的建立和插入*/
BSTree Create_Insert_Sqe(BSTree T,int elem)
{
if (T==NULL)
{
T = (BSTree)malloc(sizeof(BSTNode));
if (T == NULL)
{
printf("out of space");
}
else
{
T->data.key = elem;
T->lchild = T->rchild = NULL;
}
}
else
{
//if (elem == T->data.key) {/*空语句*/ }
if(elem < T->data.key)
T->lchild=Create_Insert_Sqe(T->lchild, elem);
else if(elem >T->data.key)
T->rchild=Create_Insert_Sqe(T->rchild, elem);
}
return T;
}
/*②二叉排序树递归查找数据key*/
BSTree Search_BST(BSTree T, int key)
{
//T = (BSTree)malloc(sizeof(BSTNode));
if (!T || T->data.key == key)
return T;
else if (key < T->data.key)
return Search_BST(T->lchild,key);
else
return Search_BST(T->rchild, key);
}
/*③寻找Min结点,递归实现*/
BSTree Find_Min(BSTree T)
{
if (T == NULL)
printf("Find failure");
else if (T->lchild)
Find_Min(T->lchild);
else
return T;
}
/*④寻找Max结点.递归实现*/
BSTree Find_Max(BSTree T)
{
if (T == NULL)
printf("Find failure");
else if (T->rchild)
Find_Max(T->rchild);
else
return T;
}
/*⑤二叉排序树删除一个结点*/
BSTree Delete_BST(BSTree T, int key)
{
BSTree release = NULL;
if (T == NULL)
printf("Delete failure");
else
{
if (key < T->data.key)
Delete_BST(T->lchild, key);
else if(key > T->data.key)
Delete_BST(T->rchild, key);
else /*key == T->data.key*/ /*看*T有几棵子树*/
{
if (T->lchild && T->rchild)/*有两个子树*/
{
T->data.key=Find_Min(T->rchild)->data.key;//T->data.key = Find_Max(T->lchild)->data.key;
T->rchild = Delete_BST(T->rchild, key);
}
else/*有一个或者无子树*/
{
release = T;
if (T->lchild)
T = T->lchild;
else
T = T->rchild;
free(release);
}
}
}
return T;
}
/*⑥中序遍历*/
int InOrder_Traverse(BSTree T)
{
if (T == NULL)
return 0;
else
{
InOrder_Traverse(T->lchild);
printf("%d ", T->data.key);
InOrder_Traverse(T->rchild);
return 1;
}
}
void main()
{
/*定义指针*/
BSTree T1 =NULL;
BSTree T_INSERT = NULL;
BSTree T_MIN = NULL;
BSTree T_MAX = NULL;
BSTree T_Search = NULL;
/*①二叉排序树的建立和插入*/
int i;
for (i = 101; i <= 110; i++)
{
T1 =Create_Insert_Sqe(T1, i);
}
/*②二叉排序树递归查找数据key*/
T_Search = Search_BST(T1, 109);
printf("%d", T_Search->data.key);
/*③寻找Min结点,递归实现*/
T_MIN = Find_Min(T1);
printf("\n%d", T_MIN->data.key);
/*④寻找Max结点,递归实现*/
T_MAX = Find_Max(T1);
printf("\n%d\n",T_MAX->data.key);
/*⑤二叉排序树删除一个结点*/
//Delete_BST(T1, 110);
/*⑥中序遍历*/
InOrder_Traverse(T1);
}
树表的查找_二叉排序树的基本操作(C语言源代码)
最新推荐文章于 2024-01-23 23:35:24 发布