简单的二叉排序树操作

#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#define OVERFLOW 0
#define OK 1
#define ERROR 0
#define MAXSIZE 64
typedef int TElemType;
typedef int Status;
typedef struct BSTNode{//结点结构 
	TElemType data;
	struct BSTNode *lchild,*rchild;//左右孩子指针
}BSTNode,*BSTree;

//二叉树的查找 
Status SearchBST(BSTree T,TElemType key,BSTree f,BSTree *p){
	//f指向T的双亲,初始调用值为NULL 
	//若查找成功,p指向查找的该数据元素的结点
	//若查找不成功,p指向查找路径上访问的最后一个结点并返回ERROR 
	if(!T){//查找不成功 
		*p=f;
		return ERROR;
	} 
	else if(key==T->data){
		
		*p=T;
		return OK; 
	}
	else if(key<T->data)
		return SearchBST(T->lchild,key,T,p);//在左子树继续查找
	else return  SearchBST(T->rchild,key,T,p);//在右子树继续查找
}

//二叉树的插入 
Status insertBST(BSTree &T,int k){
	BSTree p,s;//创建结点 
	if(!SearchBST(T,k,NULL,&p)){
		//初始化s结点 
		s = (BSTree)malloc(sizeof(BSTNode));
		s->data = k;
		s->lchild = NULL;
		s->rchild = NULL;
		if(!p) T=s; //若p结点为空,将s赋给p 
		else if(k<p->data)//key小于p结点的值
			p->lchild=s;//s插入为p结点的左孩子 
		else if(k>p->data)//key大于p结点的值
		p->rchild=s;//s插入为p结点的右孩子 
		return OK;
	}
	else return ERROR;//结点已经存在,插入失败 
}

Status CreateBSTree(BSTree &T){
	TElemType key;
	scanf("%d",&key);//ABC  DE G  F      
	if(key==' ') T=NULL;
	else{
		T=(BSTNode*)malloc(sizeof(BSTNode));
		if(!T) exit(OVERFLOW);
		T->data=key;
		CreateBSTree(T->lchild);
		CreateBSTree(T->rchild);
	}
	return OK;
} 

//凹入表打印二叉树
void print(BSTree& T,int t){
	if(T){
		print(T->rchild,t+5);
		for(int i=0;i<t;i++){
			printf(" ");
		}
		printf("%5d\n",T->data);
		print(T->lchild,t+5);
	}
} 

Status InOrderTraverse(BSTree T){
if(T){		
			InOrderTraverse(T->lchild);
			printf("%d",T->data);
			InOrderTraverse(T->rchild);
			return OK;
			return ERROR;
	}
	return OK;
}//InOrderTraverse

int main(){


BSTree T;
//CreateBSTree(T);
int n;
int a[MAXSIZE];
printf("结点数?");
 scanf("%d",&n);
printf("结点值?");
for(int i=0;i<n;i++)

{

	scanf("%d",&a[i]);
    insertBST(T,a[i]);
}
printf("\n中序:");
		InOrderTraverse(T);
		printf("\n");
print(T,1);
printf("next\n");
printf("%d",T->rchild->data);
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值