6.3二叉排序树(二叉查找树)——结构体法

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
#define endflag 0
typedef int KeyType;
typedef int InfoType;

typedef struct{
	KeyType key;
	InfoType otherinfo;
}ElemType; 

typedef struct BSTNode{
	ElemType data;
	struct BSTNode *lchild,*rchild;
}BSTNode,*BSTree;



void DeleteBST(BSTree &T,KeyType key){
	BSTree p=T,q;BSTree f=NULL;
	while(p){
		if(p->data.key==key) break;
		f=p;
		if(p->data.key>key) p=p->lchild;
		else
		p=p->rchild;
	}
	if(!p) return;
	if((p->lchild)&&(p->rchild)){
		q=p;
		BSTree s=p->lchild;
		while(s->rchild){
			q=s;s=s->rchild;
		}
		p->data=s->data;
		if(q!=p) q->rchild=s->lchild;
		else q->lchild=s->lchild;
		delete s;
		return;
	}
	else if(!p->rchild){
		q=p;p=p->lchild;
	}
	else if(!p->lchild){
		q=p;p=p->rchild;
	}
	if(!f) T=p;
	else if(q==f->lchild) f->lchild=p;
	else f->rchild=p;
	delete q;
}

void destroyBST(BSTree T){
    if(T){
        destroyBST(T->lchild);
        destroyBST(T->rchild);
        free(T);
    }
}
BSTree searchBST(BSTree T,KeyType key){//若查找成功,返回该结点的指针,否则返回空指针
	if((!T)||key==T->data.key) 
		return T;
	else 
		if(key<T->data.key) 
			return searchBST(T->lchild,key);//在左子树中查找
		else 
			return searchBST(T->rchild,key);//在右子树中查找
}

void InsertBST(BSTree &T, ElemType e){
    if(!T){//T==NULL
        T=new BSTNode;
		T->data=e;
		T->lchild=T->rchild=NULL;
    }
    else if(e.key < T->data.key){
        InsertBST(T->lchild, e);
    }
    else if(e.key > T->data.key){
        InsertBST(T->rchild, e);
    }
}
void createBST(BSTree &T){
	ElemType e;
	T=NULL;//初始化为空树
	cin>>e.key;
	while(e.key!=endflag){  //endflag为自定义结束标志
		InsertBST(T,e);//插入二叉排序树中
		cin>>e.key;
	}
}
void inorderTraverse(BSTree T){
    if(T){//T!=NULL
        inorderTraverse(T->lchild);
        printf("%d ", T->data.key);
        inorderTraverse(T->rchild);
    }
}
int main(){
	BSTree T;
	printf("请输入二叉树的值:(输入 0 为结束标志)\n");
    createBST(T);
    printf("中序遍历结果为:");
//	inorderTraverse:中文 中序遍历 
    inorderTraverse(T);
    printf("\n");
    
    KeyType key;
    
    printf("请输入要查找结点的 key 值:");
    scanf("%d", &key);
    printf("返回是:%d",searchBST(T, key));//没有该书则返回0,有的话是一串地址数 
    if (searchBST(T, key)) {
        printf("二叉排序树中存有%d\n",key);
    }else{
    	printf("二叉排序树中没有%d\n",key);
	}
	
    printf("请输入要删除结点的 key 值:");
    scanf("%d", &key);
    DeleteBST(T, key);
    printf("删除结点 %d 后中序遍历结果为:", key);
//	inorderTraverse:中文 中序遍历 
    inorderTraverse(T);

    destroyBST(T);//释放内存
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值