在二叉排序树中,大于根节点的数字是其右子树,小于根节点的数字是其左子树,等于根节点的情况,暂时不考虑。
操作:
插入、删除、遍历。
#include <stdio.h>
#include <stdlib.h>
typedef struct tree
{
int data;
struct tree *lchild,*rchild;
}BSTree,*ptree;
int SearchBST(ptree T,int key,ptree f,ptree *p)
{
//如果是空树,返回空
if(!T){(*p)=f;return 0;}
else if(T->data == key){(*p)=T;return 1;}
else if(T->data > key)return SearchBST(T->lchild,key,T,&(*p));
else return SearchBST(T->rchild,key,T,&(*p));
}
int InsertBST(ptree *T,int key)
{
ptree p,tmp;
if(!SearchBST((*T),key,NULL,&p))
{
tmp = (ptree)malloc(sizeof(BSTree));
tmp->data = key;tmp->lchild = tmp->rchild = NULL;
//如果是空树那么当前节点是根节点
if(!p)(*T) = tmp;
//如果不是空树,那么p返回的是应该插入位置的父节点位置
else if(p->data > key)p->lchild = tmp;
else p->rchild = tmp;
return 1;
}
return 0;
}
void InorderTree(ptree root)
{
if(root)
{
InorderTree(root->lchild);
printf("%d ",root->data);
InorderTree(root->rchild);
}
}
int Delete(ptree *node)
{
ptree q,s;
//没有右孩子
if(!(*node)->rchild)
{
q = (*node);(*node) = (*node)->lchild;free(q);
}
//没有左孩子
else if(!(*node)->lchild)
{
q = (*node);(*node) = (*node)->rchild;free(q);
}
//有两个孩子
else
{
q=(*node);s=(*node)->lchild;
//向右子树循环
while(s->rchild){q=s;s=s->rchild;}
//当前节点的数值替换(等效于删除)
(*node)->data = s->data;
if(q!=(*node))q->rchild=s->lchild;
else q->lchild = s->lchild;
free(s);
}
return 1;
}
//删除制定的数字
int DeleteBST(ptree *root,int key)
{
//要想删除制定的数字需要先查找相应的数字
if(!(*root))return 0;
else
{
if((*root)->data == key)return Delete(root);
else if((*root)->data > key)return DeleteBST(&(*root)->lchild,key);
else return DeleteBST(&(*root)->rchild,key);
}
}
int main()
{
ptree root;
int key,result;
root = NULL;
while(scanf("%d",&key) != EOF)
{
result = InsertBST(&root,key);
}
InorderTree(root);
printf("\n");
DeleteBST(&root,23);
InorderTree(root);
printf("\n");
return 0;
}
//12 33 21 4 5 6 7 23 123 44