二叉排序树(BST)的建立
Posted 谦谦君子,陌上其华
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉排序树(BST)的建立相关的知识,希望对你有一定的参考价值。
给一个非递归的吧。
1 /* 2 已知,二叉树存储结构定义见bstree.h,请编写一个算法函数bstree creatBstree(int a[],int n), 3 以数组a中的数据作为输入建立一棵二叉排序树,并将建立的二叉排序树进行中序遍历。 4 (提示,a中的原始数据可从data1.txt中读入,实验代码详见lab9_05.c) 6 */ 7 8 #include "Arrayio.h" 9 #include "bstree.h" 10 #define N 100 11 bstree creatBstree(int a[],int n) 12 { /*根据输入的结点序列,建立一棵二叉排序树,并返回根结点的地址*/ 13 int i, flag; 14 bstree root, p, q; 15 root = (bstree)malloc(sizeof(bsnode)); 16 root->key = a[0]; 17 root->lchild = NULL; 18 root->rchild = NULL; 19 for (i = 1; i < n; i++) 20 { 21 p = root; 22 while (true) 23 { 24 if (a[i]<p->key) 25 { 26 if (p->lchild != NULL) { p = p->lchild; flag = 0; } 27 else {flag=0;break;} 28 } 29 else if (a[i]>p->key) 30 { 31 if (p->rchild != NULL) { p = p->rchild; flag = 1; } 32 else {flag=1;break;} 33 } 34 else 35 { 36 flag = -1; break; 37 } 38 } 39 q = (bstree)malloc(sizeof(bsnode)); 40 q->key = a[i]; 41 q->lchild = NULL; 42 q->rchild = NULL; 43 if (flag==1) 44 p->rchild = q; 45 else if (flag==0) 46 p->lchild = q; 47 } 48 return root; 49 } 50 51 int main() 52 { 53 int n,a[N]; 54 bstree p,t; 55 n=readData(a,N,"data1.txt"); 56 output(a,n); 57 t=creatBstree(a,n); /*创建二叉排序树*/ 58 printf("中序遍历:\n"); 59 inorder(t); /*中序遍历二叉排序树*/ 60 61 return 0; 62 }
1 /**************************************/ 2 /* 二叉排序树用的头文件 */ 3 /* 文件名:bstree.h */ 4 /**************************************/ 5 #include<stdio.h> 6 #include<stdlib.h> 7 typedef struct node1 /*二叉排序树结点定义*/ 8 { 9 int key; /*结点值*/ 10 struct node1 *lchild,*rchild; /*左、右孩子指针*/ 11 }bsnode; 12 typedef bsnode *bstree; 13 14 /*---中序遍历二叉排序树----*/ 15 void inorder(bstree t) 16 { if (t) { inorder(t->lchild); 17 printf("%8d",t->key); 18 inorder(t->rchild); 19 } 20 21 }
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <time.h> 4 #define MAX 500000 5 6 /*从文件中读入数据存入数组a*/ 7 int readData(int a[], int n,char *f ) /*函数返回成功读入的数据个数*/ 8 { 9 FILE *fp; 10 int i; 11 fp=fopen(f,"r"); 12 if (fp==NULL) return 0; 13 else 14 { 15 for (i=0;i<n && !feof(fp);i++) 16 fscanf(fp,"%d",&a[i]); 17 fclose(fp); 18 return i; 19 } 20 } 21 22 /*存盘函数*/ 23 void saveData(int a[],int n, char *f ) 24 { 25 FILE *fp; 26 int i; 27 fp=fopen(f,"w"); 28 if (fp==NULL) printf("文件建立失败!"); 29 else 30 { 31 for (i=0;i<n;i++) 32 { if (i%10==0) fprintf(fp,"%c",‘\n‘); 33 fprintf(fp,"%8d",a[i]); 34 } 35 fclose(fp); 36 } 37 } 38 39 40 /*输出长度为n的整型数组*/ 41 void output(int a[],int n) 42 { int i; 43 printf("\n数组的内容是:\n"); 44 for (i=0;i<n;i++) 45 { if (i%10==0) printf("\n"); 46 printf("%7d",a[i]); 47 } 48 printf("\n"); 49 }
以上是关于二叉排序树(BST)的建立的主要内容,如果未能解决你的问题,请参考以下文章