二叉排序树的实现(部分)

二叉排序树的实现

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

  1. SearchBST伪代码

    void SearchBST(T,key){
    	if(T为空||T==key) return T;
    	if(T>key)
    		SearchBST(T->lchild,key);
    	else 
    		SearchBST(T->rchild,key);
    }
    
  2. InsertBST伪代码

    void InsertBST(T,key){
    	if(T为空){
    		T=new Node;
    		T=key;
    		T->lchild=NULL;
    		T->rchild=NULL;
    		return true;
    	}else if(T==key) return false;
    	else if(T>key) 
    		InsertBST(T->lchild,key);
    	else
    		InsertBST(T->rchild,key);
    }
    

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

  1. CreateBST伪代码

    BSTree CreateBST(T){
    	T=new Node;
    	T->lchild=NULL;
    	T->rchild=NULL;
    	//输入key
    	if(T不空) T=key;
    	while(key!=0){
    		//输入key
    		if(T不空){
    			InsertBST(T,key);
    		}
    	}
            return T;
    }
    
  2. 创建BST树:

    1. 数据类型定义:

      typedef struct BSTNode {
      	int data;
      	struct BSTNode* lchild, * rchild;
      }*BSTree;
      
    2. SearchBST函数:

      BSTree SearchBST(BSTree T, int key) {
      	if (T == NULL || T->data == key) return T;
      	if (T->data > key)
      		return SearchBST(T->lchild, key);
      	else
      		return SearchBST(T->rchild, key);
      }
      
    3. InsertBST函数:

      bool InsertBST(BSTree T, int key) {
      	if (T == NULL){
      		T = new BSTNode;
      		T->data = key;
      		T->lchild = NULL;
      		T->rchild = NULL;
      		return true;
      		}
      	else if (T->data == key) return false;
      	else if (T->data > key)
      		return InsertBST(T->lchild, key);
      	else
      		return InsertBST(T->rchild, key);
      }
      
    4. CreateBST函数:

      BSTree CreateBST(BSTree T) {
      	T = new BSTNode;
      	T->lchild = NULL;
      	T->rchild = NULL;
      	int key;
      	cin >> key;
      	if (T != NULL) T->data = key;
      	while (key != 0) {
      		cin >> key;
      		if (T != NULL) {
      			InsertBST(T, key);
      		}
      	}
              return T;
      }
      
    5. 中序遍历:

      void InOrder(BSTree T) {
      	if (T != NULL) {
      		InOrder(T->lchild);
      		cout << T->data<<" ";
      		InOrder(T->rchild);
      	}
      }
      
    6. main函数:

      void main()
      {
      	BSTree T;
      	T = new BSTNode;
      	int key;
      	CreateBST(T);
      	cout << "中序遍历结果为:" << endl;
      	InOrder(T);
      	cin >> key;
      	SearchBST(T, key);
      	InsertBST(T, key);
      	InOrder(T);
      }
      
    7. 代码运行截图:

3.编写DeleteBST(T, key)的伪代码实现从T中删除关键字key。

注意事项及要点:

删除关键字key首先要判断key所在结点的位置:①叶子结点②仅有左或右子树结点③左右子树都有的结点

①叶子结点:找到key后直接删除即可;

②仅有左或右子树结点:将T的双亲节点的rchild/lchild指向T的rchild/lchild,即将左右子树结点上移即可;

③左右子树都有的结点:方法一:以其前驱替代T结点,然后再删除该前驱结点。前驱是左子树中最大的结点。方法二:用其后继结点替代T结点,然后删除该后继结点。后继是右子树中最小结点。

DeleteBST伪代码:

void DeleteBST(T,key){
	if(T为空) return 0;
	else{
		if(T>key)
			DeleteBST(T->lchild,key);
		else if(T<key)
			DeleteBST(T->rchild,key);
		else{
			DeleteBST(T);
			return 1;
		}
	}
}
posted @ 2020-04-18 22:42  羊腿桂鱼yu  阅读(147)  评论(0编辑  收藏  举报