您的位置:首页 > 其它

第14周项目1(3)-验证二叉排序树相关算法

2016-12-02 22:23 337 查看
/*
*Copyright(c)2016,烟台大学计算机与控制工程学院
*Allrightsreserved.
*文件名称:项目1-3.cbp
*作者:孟琪琪
*完成日期:2016年12月2日
*版本号:v1.0

*问题描述:验证二叉排序树相关算法

*输入描述:无
*程序输出:测试数据
*/ 
#include<stdio.h>
#include<malloc.h>
typedefintKeyType;
typedefcharInfoType[10];
typedefstructnode//记录类型
{
KeyTypekey;//关键字项
InfoTypedata;//其他数据域
structnode*lchild,*rchild;//左右孩子指针
}BSTNode;

//在p所指向的二叉排序树中,插入值为k的节点
intInsertBST(BSTNode*&p,KeyTypek)
{
if(p==NULL)//原树为空,新插入的记录为根结点
{
p=(BSTNode*)malloc(sizeof(BSTNode));
p->key=k;
p->lchild=p->rchild=NULL;
return1;
}
elseif(k==p->key)//树中存在相同关键字的结点,返回0
return0;
elseif(k<p->key)
returnInsertBST(p->lchild,k);//插入到*p的左子树中
else
returnInsertBST(p->rchild,k);//插入到*p的右子树中
}

//由有n个元素的数组A,创建一个二叉排序树
BSTNode*CreateBST(KeyTypeA[],intn)//返回BST树根结点指针
{
BSTNode*bt=NULL;//初始时bt为空树
inti=0;
while(i<n)
{
InsertBST(bt,A[i]);//将关键字A[i]插入二叉排序树T中
i++;
}
returnbt;//返回建立的二叉排序树的根指针
}

//输出一棵排序二叉树
voidDispBST(BSTNode*bt)
{
if(bt!=NULL)
{
printf("%d",bt->key);
if(bt->lchild!=NULL||bt->rchild!=NULL)
{
printf("(");//有孩子结点时才输出(
DispBST(bt->lchild);//递归处理左子树
if(bt->rchild!=NULL)printf(",");//有右孩子结点时才输出,
DispBST(bt->rchild);//递归处理右子树
printf(")");//有孩子结点时才输出)
}
}
}

//在bt指向的节点为根的排序二叉树中,查找值为k的节点。找不到返回NULL
BSTNode*SearchBST(BSTNode*bt,KeyTypek)
{
if(bt==NULL||bt->key==k)//递归终结条件
returnbt;
if(k<bt->key)
returnSearchBST(bt->lchild,k);//在左子树中递归查找
else
returnSearchBST(bt->rchild,k);//在右子树中递归查找
}

//二叉排序树中查找的非递归算法
BSTNode*SearchBST1(BSTNode*bt,KeyTypek)
{
while(bt!=NULL)
{
if(k==bt->key)
returnbt;
elseif(k<bt->key)
bt=bt->lchild;
else
bt=bt->rchild;
}
returnNULL;
}

voidDelete1(BSTNode*p,BSTNode*&r)//当被删*p结点有左右子树时的删除过程
{
BSTNode*q;
if(r->rchild!=NULL)
Delete1(p,r->rchild);//递归找最右下结点
else//找到了最右下结点*r
{
p->key=r->key;//将*r的关键字值赋给*p
q=r;
r=r->lchild;//直接将其左子树的根结点放在被删结点的位置上
free(q);//释放原*r的空间
}
}

voidDelete(BSTNode*&p)//从二叉排序树中删除*p结点
{
BSTNode*q;
if(p->rchild==NULL)//*p结点没有右子树的情况
{
q=p;
p=p->lchild;//直接将其右子树的根结点放在被删结点的位置上
free(q);
}
elseif(p->lchild==NULL)//*p结点没有左子树的情况
{
q=p;
p=p->rchild;//将*p结点的右子树作为双亲结点的相应子树
free(q);
}
elseDelete1(p,p->lchild);//*p结点既没有左子树又没有右子树的情况
}

intDeleteBST(BSTNode*&bt,KeyTypek)//在bt中删除关键字为k的结点
{
if(bt==NULL)
return0;//空树删除失败
else
{
if(k<bt->key)
returnDeleteBST(bt->lchild,k);//递归在左子树中删除为k的结点
elseif(k>bt->key)
returnDeleteBST(bt->rchild,k);//递归在右子树中删除为k的结点
else
{
Delete(bt);//调用Delete(bt)函数删除*bt结点
return1;
}
}
}
intmain()
{
BSTNode*bt;
intn=10,x=55,y=43,z=55;
KeyTypea[]={43,52,75,24,10,38,67,55,63,60};
bt=CreateBST(a,n);
printf("BST:");
DispBST(bt);
printf("\n\n");

if(SearchBST(bt,x)!=NULL)
{
printf("递归法找到%d结点\n",x);
printf("\n");
}
else
{
printf("未找到%d结点\n",x);
printf("\n");
}

if(SearchBST1(bt,x)!=NULL)
{
printf("非递归法找到%d结点\n",x);
printf("\n");
}
else
{
printf("未找到%d结点\n",x);
printf("\n");
}

printf("删除%d结点\n",y);
DeleteBST(bt,y);
DispBST(bt);

printf("\n\n");
printf("删除%d结点\n",z);
DeleteBST(bt,z);
DispBST(bt);
printf("\n");
return0;

}




知识点总结:二叉排序树的应用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: