二叉排序树其实是一种排列方式,现在给定一系列的数,通过建立一个二叉树,然后对二叉树进行中序遍历即可对二叉树从小到大进行排列。
二叉树大小节点大小:左节点的数据<根节点的数据<右节点的数据
1.定义二叉树数据结构
我们采用int类型的作为节点内容
typedef struct node
{
int data; <span style="white-space:pre"> </span>//节点数据
struct node* left; //节点左指针
struct node* right; //节点右指针
}BSTree;
2.创建一颗二叉树先定义一个数组,数组中存储未排序的数据,把第一个数据作为二叉树的根节点,其余的数据循环依次往后插入
往函数中传入二叉树根节点,数组,数组长度。
void CreateBSTree(BSTree* t,int data[],int length)
{
t->data=data[0];
t->left=t->right=NULL;
for(int i=1;i<length;i++)
{
insertNode(t,data[i]);
}
}
3.遍历插入二叉树节点(重点)
类似链表的操作,定义一个分配内存的指针,这个指针不断开辟新的内存,生成节点数据,定义一个临时指针用来遍历,查找用来插入的位置,定义一个连接指针,用来连接二叉树
void insertNode(BSTree* t,int key)
{
BSTree *p,*Parent,*Head; //p指针为开辟内存的指针,不断开辟新的内存,Head指针对二叉树进行遍历,寻找插入的位置,parent用来连接新节点
p=(BSTree*)malloc(sizeof(BSTree));
p->data=key;
p->left=p->right=NULL;
Head=t; //Head指针指向根节点,每次都是从根节点进行遍历
while(Head)
{
Parent=Head; //这里一定要定义2个指针,一个指针是无法解决的
if(key<Head->data)
Head=Head->left;//如果只定义了Head指针,使用Head指针来连接的话,继续遍历Head=Head->left,最后叶子节点是空指针,空指针当然无法连接节点,需要用Parent指针来保存进行连接才行,新值小于根节点,往左遍历,大于根节点,往右遍历
else
Head=Head->right;
}
if(key<Parent->data) //注意不是head,一定要用Parent个连接
Parent->left=p; //连接节点 //新值小于根节点,连接在左子树,否则连接在右子树
else
Parent->right=p;
}
4.中序遍历输出,这个很简单,遍历即可
void LRD(BSTree* t)
{
if(t) //这个千万不能掉,否则为空报错
{
LRD(t->left);
printf("%d\n",t->data);
LRD(t->right);
}
}
5.实际调用过程
int sourec[10]={89,21,2,32,12,121,3,89,45,90};
BSTree *t=(BSTree*)malloc(sizeof(BSTree));
CreateBSTree(t,sourec,10);
LRD(t);
或者写成
BSTree t,
只不过改成
CreateBSTree(&t,sourec,10);
LRD(&t);