数构作业(2)

二叉排序树实现

一.伪代码

1.SearchBST(T, key)

SearchBST(T, key) {
	if ( T空 || T的关键字为key)    //递归终结条件
		return;
	if (T的关键字 < key)
		return(T->lchild, key);  //左子树中递归查找
	else
		return(T->rchild, key);  //右子树中递归查找
}

2.InsertBST(T,key)

InsertBST(T, key) {
	if (T为空) {  //原树为空,新插入的作为根节点
		T=(BSTree)malloc(sizeof(BSTNode));
		T->key = key;
		初始化T;
	}
	else if (key == T的关键字) //存在相同关键字节点,返回0
		return 0;
	else if (key < T的关键字)
		return InsertBST(T->lchild, key);   //插入左子树中
	else
		return InsertBST(T->rchild, key);   //插入右子树中

3.CreateBST(T)

CreateBST(T,n)
{
初始化T树为空;
while (循环n次)
{
	InsertBST(T,关键字);	
}
return;
}

4.DeleteBST(T,key)

(查找并删除二叉排序树节点的递归算法)

DeleteBST(T,key) {
	if (T为空) return 0;  //空树删除失败
	else
	{
		if (k < T的关键字) return DeleteBST(T->lchild,key);
		        //递归在左子树中删除节点
		else if (k > T的关键字) return DeleteBST(T->rchild, key);
		        //递归在右子树中删除节点
		else
		{
			Delete(T);  //调用Delete(T)函数删除节点
		}
	}
}

(删除二叉排序树p节点算法)

void Delete(BSTNode *&p) {  //从二叉排序树中删除*p节点
	BSTNode* p;
	if (p的右子树为空) {
		q = p;p = p->lchild;
		          //其左子树根节点放在被删节点位置上
		删除q;
	}
	else if (p的左子树为空) {
		q = p;p = p->rchihld;
		          //其左子树根节点放在被删节点位置上
		删除q;
	}
	else Delete1(p,p->lchild)
	              //*p节点既有左子树又有右子树的情况
}

(删除二叉排序树中均有左右子树的算法)

void Delete1(BSTNode* p,  BSTNode*& r)
//当被删*p结点有左右子树时的删除过程
{
    BSTNode* q;
    if (r右孩子不为空)
        Delete1(p,r->rchild);	//递归找被删结点左子树的最右下结点(前驱结点)
    else  		                //找到最右下节点*r
    {
        将* r的关键字赋给* P;
        q = r;r = r->lchild;
        删除q;
    }
}

二.代码实现

1.二叉排序树节点定义

typedef struct BSTNode  
{  
    int key;  
    struct node*lchild, *rchild;  
} BSTNode;

2.main函数

int main(){
 printf("请输入关键字\n");
 CreatBST(T);
 printf("二叉排序树的中序遍历序列:\n");
 InOrderTraverse(T);
 int n;
 printf("输入要查找的数据:\n");
 while(scanf("%d",&n) != EOF && n){
  if(SearchBST(T, n))
   printf("输出查找的结果:该结点已找到。\n");
  else
   printf("输出查找的结果:该结点未找到。\n");
 }
    return 0;
}

3.中序遍历

void InorderTraverse(BSTree T)//中序遍历
{  
     if(T)
     {  
          InorderTraverse(T->lchild);
          printf("%d ",T->key);
          InorderTraverse(T->rchild);
     }
}

4.SearchBST(T, key)

int SearchBST(BSTree T,int key)
{
    if (T == NULL || T->key == k)
        return T;
    if (k < T->key)
        return SearchBST(T->lchild, k);
    else
        return SearchBST(T->rchild, k);
}

5.InsertBST(T,key)

int InsertBST(BSTNode T,int key)
{
    if (T == NULL)
    {
        T=(BSTree)malloc(sizeof(BSTNode));
        T->key = key;
        T->lchild = NULL;
        T->rchild = NULL;
    }
    else if (key == T->key)
        return 0;
    else if (key < T->key)
        InsertBST(T->lchild,key);
    else
        InsertBST(T->rchild,key);
}

6.CreateBST(T)

int CreatBST(BSTree T)
{
    T = NULL;
    int i = 0;
    while (i < n)
    {
        InsertBST(T,A[i]);
        i++;
    }
    return T;
}

使用“50 30 80 20 40 90 10 25 35 85 23 88”创建BST,并中序输出该BST

7.DeleteBST(T,key)

(查找并删除二叉排序树节点的递归算法)

int DeleteBST(BSTNode &T,int key)  
{
    if (T == NULL) return 0;	
    else
    {
        if (k < T->key) return DeleteBST(T->lchild,k);
        
        else if (k >T->key) return DeleteBST(T->rchild,k);
        
        else   
        {
            Delete(T);    
            return 1;
        }
    }
}

(删除二叉排序树p节点算法)

void Delete(BSTNode *&p)   	 
{
    BSTNode* q;
    if (p->rchild == NULL)        	
    {
        q = p; p = p->lchild;		
        free(q);
    }
    else if (p->lchild == NULL)    	
    {
        q = p; p = p->rchild;	
        free(q);
    }
    else Delete1(p,p->lchild);
}

(删除二叉排序树中均有左右子树的算法)

void Delete1(BSTNode *p,BSTNode *&r)
{
    BSTNode* q;
    if (r->rchild != NULL)
        Delete1(p,r->rchild);	
    else  		              
    {
        p->key = r->key;  
        p->data = r->data;   
        q = r; r = r->lchild;          
        free(q); 	              
    }
}
posted @ 2020-04-19 17:47  Styoool(曾广芝)  阅读(122)  评论(0)    收藏  举报