二叉排序树的实现作业

#include<iostream>
using namespace std;
typedef int KeyType ;
typedef struct node
{
KeyType key;//关键字
struct node* rchild,*lchild;
}BSTNode;


1. 编写SearchBST(T, key)与InsertBST(T, key)的伪代码,并实现;

1.SearchBST伪代码:

//void SearchBST(T, key)

//{

//if (T为空 || T->key == key)

//{

//return T;

//}

//else

//{

//if(T->key < key)

//return SearchBST(T->lchild,key);

//else

//return SearchBST(T->rchild, key);

//}

// }
查找二叉排序树代码:
BSTNode* SearchBST(BSTNode*T, KeyType key)
{
    if (T==NULL || T->key == key)
    {
        return T;
    }
    else
    {
        if(T->key>key)
            return SearchBST(T->lchild,key);
        else
        return SearchBST(T->rchild, key);
    }
 }
InsertBST(T, key)的伪代码:

// InsertBST(T, key)

//{

//    if (T为空)

//    {

//        插入新结点;

//    }

//    else if(key ==T->key)

//    return false;

//    else if (T->key > key)

//   {

//   InsertBST(T->lchild, key);

//   }

//    else

//   {

//   InsertBST(T->rchild, key);

// }

//}

InsertBST代码:

 bool InsertBST(BSTNode*&T,KeyType key)

{

     if (T == NULL)

     {

         T = new BSTNode;

         T->key = key;

         T->lchild = T->rchild = NULL;

     }

     else if (T->key == key)

         return false;

    else if (T->key > key)

    {

    return InsertBST(T->lchild, key);

    }

    else

   {

    return InsertBST(T->rchild, key);

   }



}

2. 编写CreateBST(T)的伪代码实现从控制台输入创建BST树。最后使用代码实现。使用“50 30 80 20 40 90 10 25 35 85 23 88”创建BST,并中序输出该BST:

CreateBST(T)的伪代码:

 CreateBST(T)

//{

//    int n,i=0;

//    KeyType a[100];

//    cin >> n;

//    

//    while (i < n)

//    {

//        cin >> a[i];

//        InsertBST(T,a[i]);

//        i++;

//    }

//    return T;

//}
创建二叉排序树代码:
BSTNode* CreateBST(BSTNode* T)
{
	int n,i=0;
	KeyType a[100];
	cin >> n;
	
	while (i < n)
	{
		cin >> a[i];
		InsertBST(T,a[i]);
		i++;
	}
	return T;
}

  

#include<iostream>
using namespace std;
typedef int KeyType ;
typedef struct node
{
    KeyType key;//关键字
    struct node* rchild,*lchild;
}BSTNode;
void InOrder(BSTNode* T);
bool InsertBST(BSTNode*& T, KeyType key);
BSTNode* CreateBST(BSTNode* &T);
int main()
{
    BSTNode *T=NULL;
    CreateBST(T);
    InOrder(T);

}
void InOrder(BSTNode* T)
{
    if (T != NULL)
    {
        InOrder(T->lchild);
        cout << T->key<<' ';
        InOrder(T->rchild);
    }
}
bool InsertBST(BSTNode*&T,KeyType key)
{
     if (T == NULL)
     {
         T = new BSTNode;
         T->key = key;
         T->lchild = T->rchild = NULL;
         return true;
     }
     else if (T->key == key)
         return false;
    else if (T->key > key)
    {
    return InsertBST(T->lchild, key);
    }
    else
   {
    return InsertBST(T->rchild, key);
   }

}

BSTNode* CreateBST(BSTNode* &T)
{
    int n,i=0;
    KeyType a[100];
    cin >> n;
    
    while (i < n)
    {
        cin >> a[i];
        InsertBST(T,a[i]);
        i++;
    }
    return T;
}

3. 编写DeleteBST(T, key)的伪代码实现从T中删除关键字key。如果无法编写出来,请写出在BST中删除关键字key所需注意的事项:

//bool DeleteBST(BSTNode*& T, KeyType key)
//{  
//    if (T不空)
//    {
//        if (T->key == key)
//        {
//            Delete (T);
//            return true;
//        }
//        else if (T->key > key)
//        {
//            DeleteBST(T->lchild, key);
//        }
//        else
//            DeleteBST(T->rchild, key);
//    }
//    else 
//        return false;
//}
//void Delete(BSTNode*& p)
//{
//    BSTNode* q;
//    if (p没有右子树)
//    {
//        q = p;
//        p = p->lchild;
//        delete q;
//    }
//    else if (p没有左子树)
//    {
//        q = p;
//        p = p->rchild;
//        delete q;
//    }
//    else Deletel(p, p->lchild);
//}
//void Deletel(BSTNode* p, BSTNode*& r)
//{
//    BSTNode* q;
//    if (r->rchild != NULL)
//        找最右下结点
//    else
//    {
//        p->key = r->key;
//        q = r;
//        r = r->lchild;
//        delete q;
//    }
//}

 

4. 选做:使用代码实现DeleteBST(T, key):

bool DeleteBST(BSTNode*& T, KeyType key)
{  
    if (T != NULL)
    {
        if (T->key == key)
        {
            Delete (T);
            return true;
        }
        else if (T->key > key)
        {
            DeleteBST(T->lchild, key);
        }
        else
            DeleteBST(T->rchild, key);
    }
    else 
        return false;
}
void Delete(BSTNode*& p)
{
    BSTNode* q;
    if (p->rchild == NULL)
    {
        q = p;
        p = p->lchild;
        delete q;
    }
    else if (p->lchild == NULL)
    {
        q = p;
        p = p->rchild;
        delete q;
    }
    else Deletel(p, p->lchild);
}
void Deletel(BSTNode* p, BSTNode*& r)
{
    BSTNode* q;
    if (r->rchild != NULL)
        Deletel(p, r->rchild);
    else
    {
        p->key = r->key;
        q = r;
        r = r->lchild;
        delete q;
    }
}

 

posted @ 2020-04-19 21:45  茅志雄  阅读(169)  评论(0编辑  收藏  举报