码迷,mamicode.com
首页 > 编程语言 > 详细

二叉排序树

时间:2020-04-19 22:09:22      阅读:80      评论:0      收藏:0      [点我收藏+]

标签:节点   turn   creat   null   它的   ebs   lan   else   左右   

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

  • SearchBST(T,key)伪代码:

    InsertBST(T, key)
    {
    	if (T空 || T->key == key)
    		return T;
    	if(key<T->key)
    		return SearchBST(T->lchild, key);
    	else
    		return SearchBST(T->rchild, key);
    }
    
  • InsertBST(T,key)伪代码:

    InsertBST(T, key) {
    	if (T空)
    	{
    		T = new BSTNode;
    		T->key = key;
    		T->lchild= T->rchild=NULL;
    	}
    	else if (key == T->key)
    		return;
    	else if (k < T->key)
    		return InsertBST(T->lchild, key);
    	else
    		return InsertBST(T->rchild, key)
    }
    
  • 实现:

    • 代码:

      BSTNode* SearchBST(BSTNode* T, KeyType key)
      {
      	if (T == NULL || T->key == key)
      		return T;
      	if (key < T->key)
      		return SearchBST(T->lchild, key);
      	else
      		return SearchBST(T->rchild, key);
      }
      bool InsertBST(BSTNode* T, KeyType key)
      {
      	if (T == NULL)
      	{
      		T = new BSTNode;
      		T->key = key;
      		T->lchild = T->rchild = NULL;
      	}
      	else if (key == T->key)
      		return false;
      	else if (key < T->key)
      		return Insert(T->lchild, key);
      	else
      		return Insert(T->rchild, key);
      }
      
    • 运行结果:

2.编写CreateBST(T)的伪代码与实现

  • 伪代码:

    CreateBST(A[], n)
    {
        BSTNode* T = NULL;
        int i = 0;
        while (i < n)
        {
            InsertBST(T, A[i]);
            i++;
        }
        return T;
    }
    
  • 实现:

    • 代码:
    BSTNode* CreateBST(KeyType A[], int n)
    {
        BSTNode* T = NULL;
        int i = 0;
        while (i < n)
        {
            InsertBST(T, A[i]);
            i++;
        }
        return T;
    }
    void inOrder(BSTNode* T)
    {
        if (T == NULL)
            return;
        else
        {
            inOrder(T->lchild);
            cout << T->key << " ";
            inOrder(T->rchild);
        }
    }
    
    • 运行结果:

3.编写DeleteBST(T,key)伪代码

  • 伪代码:

    DeleteBST( T, key)
    {	
        if (!T)		
            return false;	
        else 
        { 
            if (key == T->key)	
                Delete(T)函数;	
            else if (key < T->key)	
                return DeleteBST(T->lchild, key);	
            else	
                return DeleteBST(T->rchild, key); 
        } 
    }
    int Delete(BSTNode* p)
    {	
        BSTNode *q, *s;
        if
            (!p->lchild && !p->rchild)	
            p = NULL;	
            else if (!p->lchild)	
        { 
            q = p;		
            p = p->rchild;		
            delete q;
        } 
            else if (p->rchild)
        {
            q = p;	
            p = p->lchild;		
            delete q; 
        }
            else					
        { 
            q = p;	
            s = p->lchild;	
            while (s->rchild)		
            {
                q = s;		
                s = s->rchild;
            }	
            p->key = s->key;	
            if (q != p)		 
                q->rchild = s->lchild;	
            else	
                q->lchild = s->lchild;
            delete s;
        }	
        return true; 
    }
    
    

4.代码实现DeleteBST(T,key)

int DeleteBST(BSTNode* T, KeyType key)
{	
    /* 若二叉排序树T中存在关键字等于key的数据元素时,则删除该数据元素节点 */
    /* 并返回TRUE;否则返回FALSE */
    if (!T)		
        return false;	
    /* 不存在关键字等于key的数据元素 */	
    else 
    { 
        if (key == T->key)	
            Deletel(T);	
        else if (key < T->key)	
            return DeleteBST(T->lchild, key);	
        else	
            return DeleteBST(T->rchild, key); 
    } 
}
int Deletel(BSTNode* p)//从二叉排序树中删除节点p, 并重接它的左或右子树
{	
    BSTNode *q, *s;
    if
        (!p->lchild && !p->rchild)	// p为叶子节点 	
        p = NULL;	else if (!p->lchild)	// 左子树为空,重接右子树
    { 
        q = p;		
        p = p->rchild;		
        delete q;
    } 
        else if
        (p->rchild)	// 右子树为空,重接左子树 
    {
        q = p;	
        p = p->lchild;		
    delete q; 
    }
        else						// 左右子树均不为空 
    { 
        q = p;	
        s = p->lchild;	
        while (s->rchild)		// 转左,向右走到尽头
        {
            q = s;		
            s = s->rchild;
        }	
        p->key = s->key;	
        if (q != p)		   //判断是否执行上述while循环 
            q->rchild = s->lchild;	// 执行上述while循环,重接右子树
        else	
            q->lchild = s->lchild;	// 未执行上述while循环,重接左子树	
        delete s;
    }	
    return true;
}

明天早上看可以吗(╥ω╥`) 非常感谢!!!!!

二叉排序树

标签:节点   turn   creat   null   它的   ebs   lan   else   左右   

原文地址:https://www.cnblogs.com/599-/p/12734027.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!