二叉排序树的定义不再叙述,主要介绍方法与代码。
这里要求构造二叉排序树后输入其中序遍历(可得到从小到大的排列)
核心算法:用递归或循环使小于结点的往左边放置
先介绍通过顺序储存的方法
代码如下:
#include<stdio.h>
#include<string.h>
#define maxn 1005000
int d[maxn];//存所有数据
int dl[maxn];//存左子树序号
int dr[maxn];//存右子树序号
void mid(int k){//中序遍历
if(k>0){
mid(dl[k]);
printf("%d ",d[k]);
mid(dr[k]);
}
}
int main()
{
int i,t;
scanf("%d",&t);//t个数
for(i=1;i<=t;i++) scanf("%d",&d[i]);
for(i=2;i<=t;i++){//第一个为根节点 从第二个开始比
int p=1;
while(1){
if(d[i]<=d[p]){
if(!dl[p]){//子树为空
dl[p]=i;
break;
}
else p=dl[p];//继续比较
}
else{
if(!dr[p]){
dr[p]=i;
break;
}
else p=dr[p];
}
}
}
mid(1);
return 0;
}
第二种为用链式储存的方法,使用递归就非常简单
代码如下
#include<stdio.h>
#include<stdlib.h>
typedef struct node {
int data;
struct node*lch;
struct node*rch;
}BTNode,*tree;
tree root = NULL;
void mid(tree q){//中序遍历
if (q) {
mid(q->lch);
printf("%d ",q->data);
mid(q->rch);
}
}
tree createNode(int n){//建树
tree t=(tree)malloc(sizeof(BTNode));
t->data=n;
t->lch=NULL;
t->rch=NULL;
return t;
}
void build (tree t,int n){//递归构造二叉排序树
if (n<=t->data) {
if(t->lch==NULL) t->lch=createNode(n);
else build(t->lch, n);
}
else {
if(t->rch==NULL) t->rch=createNode(n);
else build(t->rch, n);
}
}
int main()
{
int i,t,m;
scanf("%d",&t);//t个数
for(i=0;i<t;i++) {
scanf("%d",&m);
if(i==0) root=createNode(m);
else build(root,m);
}
mid(root);
return 0;
}
这就是构造二叉排序树的两种方法
欢迎大佬指正