二叉查找树的创建,查找,删除,插入的c描述

树大家应该都不陌生,树可以是很基础的ADT,比如我们今天要提到的二叉查找树喽大笑

二叉查找树或者是一棵空树,或者是具有下列性质的 二叉树
(1)若左子树不空,则左子树上所有结点的值均小于它的 根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于或 等于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
(4)没有键值相等的节点。
说的直白一些,1.每一个节点都最多只有两个孩子

2.左边的孩子的值<父节点的值<右孩子节点的值(不能等于哦),并且每个点都是这样。

满足这两点就是二叉查找树。

#include <stdio.h>
#include <stdlib.h>

struct Node;
typedef struct Node *Tree;/*树Tree*/
typedef struct Node *Position;/*节点Position*/
struct Node
{
char element;
Tree left;
Tree right;
};
/*中序插入,当输入为space时,令节点为NULL,直到节点都填满*/
void Initialize(Tree *T)
{
char c;
scanf("%c",&c);
if(c!=' ')
{
	*T=malloc(sizeof(struct Node));
	(*T)->element=c;
	Initialize(&(*T)->left);
	Initialize(&(*T)->right);
}
else
	*T=NULL;
}
/*x小于节点就递归遍历左子树,大于就递归遍历右子树*/
Position Find(Tree T,char x)
{
if(T==NULL)
	return NULL;
else if(T->element>x)
	return Find(T->left,x);
else if(T->element<x)
	return Find(T->right,x);
else if(T->element==x)
	return T;
}
Tree Insert(Tree *T,char x)
{
if(*T==NULL)
{	
	*T=malloc(sizeof(struct Node));
	(*T)->element=x;
	(*T)->left=NULL;
	(*T)->right=NULL;
}
if(x<(*T)->element)	
	(*T)->left=Insert(&(*T)->left,x);
else if(x>(*T)->element)
	(*T)->right=Insert(&(*T)->right,x);
return *T;
}
/*递归左子树到最后,就是最小节点*/
Position FindMin(Tree T)
{
if(T==NULL)
	return NULL;
else if(T->left==NULL)
	return T;
else 
	return FindMin(T->left);
}
Tree Delete(Tree (*T),char x)
{
Position Tmp;
if((*T)==NULL)
	printf("error");
else if((*T)->element<x)
	(*T)->right=Delete(&((*T)->right),x);
else if((*T)->element>x)
	(*T)->left=Delete(&(*(T)->left),x);
else if((*T)->left&&(*T)->right)/*如果节点有两个子树,则把其右子树的最小节点Tmp放到该节点上,然后删除节点T的右子树*/
{
	Tmp=FindMin((*T)->right);
	(*T)->element=Tmp->element;
	(*T)->right=Delete(&(*T)->right,(*T)->element);
}
else/*如果只有一个子树,则让这个子树代替删除节点*/
{
	Tmp=*T;
	if((*T)->left==NULL)
		(*T)=(*T)->right;
	else if((*T)->right==NULL)
		(*T)=(*T)->left;
	free(Tmp);
}
return *T;
}
/*递归输出这棵树^-^*/
void Print(Tree T)
{
if(T)
{
	printf("%c\t",T->element);
	Print(T->left);
	Print(T->right);
}
}
int main()
{
Tree T;
printf("Please Input Tree\n");
Initialize(&T);
printf("输出一棵树:\n");
Print(T);
printf("\n");
T=Insert(&T,'3');
printf("插入节点3:\n");
Print(T);
printf("\n");
printf("找出最小值:\n");
FindMin(T);
printf("%c\n",(FindMin(T))->element);
printf("删除3:\n");
T=Delete(&T,'3');
Print(T);
printf("\n");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值