#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct LTree
{
int data;
struct LTree *Lchild,*Rchild;
}LTree,*BiTree;
void InsertTree(BiTree *T,int number);
void Traversal(BiTree T);
void SearchElement(BiTree T,int number);
bool Delete(BiTree *p);
bool DeleteElement(BiTree *T,int number);
/*插入节点*/
void InsertTree(BiTree *T,int number)
{
/*当节点为空时插入*/
if(*T == NULL)
{
(*T) = (BiTree)malloc(sizeof(LTree));
(*T)->data = number;
(*T)->Lchild = (*T)->Rchild = NULL;//置左右节点子节点为空
return ;
}
else if(number == (*T)->data)//树中已经存在值相同的节点
return;//结束
else if(number < (*T)->data)//元素小于当前节点向左子树走
InsertTree(&(*T)->Lchild,number);
else if(number > (*T)->data)//元素大于当前节点向右子树走
InsertTree(&(*T)->Rchild,number);
}
/*中序遍历*/
void Traversal(BiTree T)
{
if(T == NULL)return;
Traversal(T->Lchild);
printf("%d ",T->data);
Traversal(T->Rchild);
}
/*查找元素*/
void SearchElement(BiTree T,int number)
{
//当遍历到NULL(代表没找到节点)或 找到与树中与查找元素相同的节点时 结束查找
while (T != NULL && T->data != number)
{
if(number < T->data)T = T->Lchild;//元素小于节点的值 向左走
else T = T->Rchild;//否则 向右走
}
if(T == NULL)printf("没有此数!\n");
else printf("查找成功!\n");
}
/*从二叉排序树中删除结点 p , 并重接它的左/右子树*/
bool Delete(BiTree *p){
BiTree q, s;
if ((*p)->Rchild == NULL)
{ // 右子树空 则只需要重接它的左子树
q = *p;
*p = (*p)->Lchild;
free(q);
}
else if ((*p)->Lchild == NULL)
{ // 左子树空 则只需要重接它的右子树
q = *p;
*p = (*p)->Rchild;
free(q);
}
else
{ // 左右子树都不空
q = *p;
s = (*p)->Lchild;
while (s->Rchild)
{ // 向右到尽头,找到待删结点的前驱
q = s;
s = s->Rchild;
}
(*p)->data = s->data; // s 指向被删除结点的直接前驱 (将被删结点前驱的值取代被删结点的值)
if (q != *p)
q->Rchild = s->Lchild; // 重接 q 的右子树
else
q->Lchild = s->Lchild; // 重接 q 的左子树
free(s);
}
return true;
}
/**
* 二叉排序树的删除
* 当二叉排序树中存在关键字等于 number 的数据元素时,删除该数据元素并返回TRUE
*/
bool DeleteElement(BiTree *T, int number){
if (!*T)return false;
else
{
if (number == (*T)->data)
Delete(T);
else if (number < (*T)->data)
DeleteElement(&(*T)->Lchild, number);
else
DeleteElement(&(*T)->Rchild, number);
}
}
int main(int argc, char const *argv[]) {
BiTree T = NULL;
int number;
printf("请输入数字,-1结束:");
scanf("%d",&number);
while (number != -1)
{
InsertTree(&T,number);
scanf("%d",&number);
}
printf("中序遍历:");
Traversal(T);
printf("\n请输入查找数字:");
scanf("%d",&number);
SearchElement(T,number);
printf("请输入删除数字:");
scanf("%d",&number);
DeleteElement(&T,number);
printf("删后遍历:");
Traversal(T);
printf("\n");
return 0;
}
王道考研 ++++ 二叉排序树(C语言 链表)
猜你喜欢
转载自blog.csdn.net/WX_1218639030/article/details/98102065
今日推荐
周排行