数据结构之二叉排序树的查找、插入和删除操作
//
// main.c
// Binary_Sort_Tree
//
// Created by zhanglei on 2020/4/30.
// Copyright © 2020 zhanglei. All rights reserved.
//
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int Elemtype;
typedef struct BiTNode
{
Elemtype data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
// 创建一颗二叉树
void CreatBiTree(BiTree *T)
{
char c;
scanf("%c",&c);
if( c==' ' )
*T = NULL;
else
{
*T = (BiTNode *)malloc(sizeof(BiTNode));
(*T)->data = c; // 按照前序创建
CreatBiTree(&(*T)->lchild);
CreatBiTree(&(*T)->rchild);
}
}
// 遍历二叉树
void PreOrderTraverse( BiTree T )
{
if ( T==NULL )
return;
else
{
PreOrderTraverse(T->lchild); // 按照中序输出
printf("%d ",T->data);
PreOrderTraverse(T->rchild);
}
}
// 二叉排序树查找操作
Status SearchBST(BiTree T, int key, BiTree f, BiTree *p)
{
if ( !T )
{
*p = f;
return FALSE;
}
else if ( key==T->data )
{
*p = T;
return TRUE;
}
else if ( key<T->data )
return SearchBST(T->lchild,key,T,p);
else
return SearchBST(T->rchild,key,T,p);
}
// 二叉排序树插入操作
Status InsertBST(BiTree *T, int key)
{
BiTree p,s;
if (!SearchBST(*T, key, NULL, &p))
{
s = (BiTree)malloc(sizeof(BiTNode));
s->data = key;
s->lchild = s->rchild = NULL;
if ( !p )
*T = s;
else if ( key<p->data )
p->lchild = s;
else
p->rchild = s;
return TRUE;
}
else
return FALSE;
}
Status 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;
if (q!=*p)
q->rchild = s->lchild;
else
q->lchild = s->lchild;
free(s);
}
return TRUE;
}
// 二叉排序树删除操作
Status DeleteBST(BiTree *T, int key)
{
if ( !*T )
return FALSE;
else
{
if ( key==(*T)->data )
return Delete(T);
else if ( key<(*T)->data )
return DeleteBST(&(*T)->lchild, key);
else
return DeleteBST(&(*T)->rchild, key);
}
}
int main()
{
int i;
int a[10]={62,88,58,47,35,73,51,99,93,21};
BiTree T = NULL;
for (i=0; i<10; i++)
{
InsertBST(&T,a[i]);
}
PreOrderTraverse(T);
printf("\n");
DeleteBST(&T, 88);
PreOrderTraverse(T);
printf("\n");
return 0;
}
这里通过二叉排序树的插入操作将数组中的数值构建一个二叉排序树,然后通过调用二叉树的中序遍历法遍历二叉树并将数据打印,然后调用删除操作,将数据88从二叉排序树中删除掉。
21 35 47 51 58 62 73 88 93 99
21 35 47 51 58 62 73 93 99
Program ended with exit code: 0
在二叉排序树的删除操作中最后的判断条件需要注意一下
if (q!=*p)
q->rchild = s->lchild;
else
q->lchild = s->lchild;
前者是当被删除的结点的左子树有右子树的情况下进行的
后者是当被删除的结点的左子树没有右子树的情况下进行的
有点绕,这里画图看比较容易理解👇