版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39360985/article/details/78857844
编译器:Xcode
编程语言:C
data1.txt文本数据为上图,在我的电脑里它的存储位置是:/Users/wsw/Desktop/数据结构/data1.txt
#include<stdio.h>
#include<stdlib.h>
#define N 100
typedef struct node //二叉排序树结点定义
{
int key; //结点值
struct node *lchild,*rchild; //左、右孩子指针
}bsnode;
typedef bsnode *bstree;
//从文件中读入数据存入数组a
int readData(int a[], int n,char *f ) //函数返回成功读入放入数据个数
{
FILE *fp;
int i;
fp=fopen(f,"r");
if (fp==NULL) return 0;
else
{
for (i=0; i<n && !feof(fp); i++)
fscanf(fp,"%d",&a[i]);
fclose(fp);
return i;
}
}
void output(int a[],int n) //输出数组的内容
{
int i;
printf("数组的内容是:");
for (i=0; i<n; i++)
{
if (i%10==0)
printf("\n");
printf("%7d",a[i]);
}
printf("\n");
}
bstree creatBstree(int a[],int n) //非递归建立二叉排序树
{
//根据输入的结点序列,建立一棵二叉排序树,并返回根结点的地址
bstree bt;
bt=(bstree)malloc(sizeof(bsnode));
bt->key=a[0];
bt->lchild=bt->rchild=NULL;
for(int i=1;i<n;i++)
{
bstree s,p=bt,q;
s=(bstree)malloc(sizeof(bsnode));
s->key=a[i];
s->lchild=s->rchild=NULL;
while (p)
{
if (p->key>a[i])
{
q=p;
p=p->lchild;
}
else
{
q=p;
p=p->rchild;
}
}
if (q->key>a[i])
q->lchild=s;
else
q->rchild=s;
}
return bt;
}
/*
p是待判断的节点,一个要插入的节点需要和p节点的值进行比较,
比p的值大,就往p的右孩子找,p=p->rchild,
比p的值小,就往p的左孩子找,p=p->lchild;
q记录的是当前需要插入节点的父亲节点,
当前需要插入节点的值比它的值小,成为它的左孩子,q->lchild=s,
当前需要插入节点的值比它的值大,成为它的右孩子,q->rchild=s
*/
void inorder(bstree t) //中序遍历二叉排序树
{
if (t)
{
inorder(t->lchild);
printf("%8d",t->key);
inorder(t->rchild);
}
}
//中序遍历的原因是:对于二叉排序树,中序遍历的结果就是从小到大排列的,所以可以用来判断二叉排序树是否成功创建.
int main()
{
int n,a[N];
bstree t;
n=readData(a,N,"/Users/wsw/Desktop/数据结构/data1.txt");
output(a,n);
t=creatBstree(a,n); //创建二叉排序树
printf("中序遍历:\n");
inorder(t);
return 0;
}
运行结果: