#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;
}
简单的二叉排序树操作
最新推荐文章于 2024-10-01 07:42:48 发布