您的位置:首页 > 理论基础 > 数据结构算法

一步一步复习数据结构和算法基础-二叉排序树

2012-07-23 19:15 579 查看
在二叉排序树中,大于根节点的数字是其右子树,小于根节点的数字是其左子树,等于根节点的情况,暂时不考虑。

操作:

插入、删除、遍历。

#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


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息