第十四周项目1-(3)二叉排序树

问题及代码:

/*   
*烟台大学计控学院    
*作    者:房斐 
*完成日期:2016年12月8日
*问题描述:认真阅读并验证二叉排序树相关算法。 
(1)由整数序列{43,52,75,24,10,38,67,55,63,60}构造二叉排序树; 
(2)输出用括号法表示的二叉排序树; 
(3)用递归算法和非递归算法查找关键字55; 
(4)分别删除43和55,输出删除后用括号法表示的二叉排序树。
*/ 

#include <stdio.h>
#include <malloc.h>
typedef int KeyType;  
typedef char InfoType[10];  

typedef struct node
{
KeyType key;
InfoType data;
struct node* lchild,* rchild;
}BSTNode;
int InsertBST(BSTNode *&p,KeyType k)
{
 if(p==NULL)
 {
   p=(BSTNode *)malloc(sizeof(BSTNode));
   p->key=k;
   p->lchild=p->rchild=NULL;
   return 1;
 }
else if(k==p->key)
return 0;
else if(k<p->key)
  return InsertBST(p->lchild,k);
else
  return InsertBST(p->rchild,k);
}
BSTNode *CreateBST(KeyType A[],int n)
{
	BSTNode *bt=NULL;
int i=0;
 while(i<n)
 {
   InsertBST(bt,A[i]);
   i++;
 }
 return bt;
}

//输出一棵排序二叉树  
void DispBST(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(")");                        //有孩子结点时才输出)  
        }  
    }  
}  
BSTNode *SearchBST(BSTNode *bt,KeyType k)
{
if(bt==NULL || bt->key==k)
return bt;
if(k<bt->key)
return SearchBST(bt->lchild,k);
else
return SearchBST(bt->rchild,k);
}
BSTNode *SearchBST1(BSTNode *bt,KeyType k)
{
 while (bt!=NULL)
 {
 if(k==bt->key)
	 return bt;
 else if(k<bt->key)
	 bt=bt->lchild;
 else 
	 bt=bt->rchild;
 }
 return NULL;

}
void Delete1(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的空间  
    }  
}  
  
void Delete(BSTNode *&p)   //从二叉排序树中删除*p结点  
{  
    BSTNode *q;  
    if (p->rchild==NULL)        //*p结点没有右子树的情况  
    {  
        q=p;  
        p=p->lchild;            //直接将其右子树的根结点放在被删结点的位置上  
        free(q);  
    }  
    else if (p->lchild==NULL)   //*p结点没有左子树的情况  
    {  
        q=p;  
        p=p->rchild;            //将*p结点的右子树作为双亲结点的相应子树  
        free(q);  
    }  
    else Delete1(p,p->lchild);  //*p结点既没有左子树又没有右子树的情况  
}  
  
int DeleteBST(BSTNode *&bt, KeyType k)  //在bt中删除关键字为k的结点  
{  
    if (bt==NULL)  
        return 0;               //空树删除失败  
    else  
    {  
        if (k<bt->key)  
            return DeleteBST(bt->lchild,k); //递归在左子树中删除为k的结点  
        else if (k>bt->key)  
            return DeleteBST(bt->rchild,k); //递归在右子树中删除为k的结点  
        else  
        {  
            Delete(bt);     //调用Delete(bt)函数删除*bt结点  
            return 1;  
        }  
    }  
}  
int main()  
{  
    BSTNode *bt;  
    int n=10,x=43;  
    KeyType a[]= {43,52,75,24,10,38,67,55,63,60,};  
    bt=CreateBST(a,n);  
    printf("BST:");  
    DispBST(bt);  
    printf("\n");  
    printf("删除%d结点\n",x);  
    if (SearchBST(bt,x)!=NULL)  
    {  
        DeleteBST(bt,x);  
        printf("BST:");  
        DispBST(bt);  
        printf("\n");  
    }  
    return 0;  
  
}  


运行结果:

猜你喜欢

转载自blog.csdn.net/qq_35254240/article/details/53514867
今日推荐