不定期更新的程序分享
今天刚学了二叉树的建立,刚开始可是懵啊,倒腾了半天才自己理解喽,
其实二叉树的创建和链表的创建大同小异,只是多了与前驱结点的比较,以及比较后向左还是向右创建,也可以理解成链表是二叉树的特殊情况。
以下为整个程序以及自己的一些注释(Vc++)
#include <stdio.h>
#include <stdlib.h>
typedef struct node{ //把一个结点看成三个部分,data表示节点的数值,left表示左子女,right则表示右结点
int data;
struct node *left;
struct node *right;
}BTnode;
BTnode *Creat(int a[],int N)
{
BTnode *root,*p,*c,*pa; //定义root为根结点,pa为双亲结点
int i;
root=(BTnode *)malloc(sizeof(BTnode));
root->data=a[0]; //初始化root,数组的第一个数为根节点,
root->left=root->next=NULL; //设根节点的后继结点为空
for(i=1;i<N;i++)
{
p=(BTnode *)malloc(sizeof(BTnode)); //定义一个p结点,用来接收数组中的数据
p->data=a[i];
p->left=p->right=NULL; //设p结点的后继结点也为空
c=root; //注意:每次开始新一轮的循环时,都是c指向root
while(c){ //判断当c为空时跳出循环
/*第一次循环:pa和c指向根节点;循环结束,c指向了c的left或right,这时pa是c的双亲结点,
若c仍不为空,pa则指向c指向的结点,c又继续指向c的left或right,pa则一直是c的双亲结点,如此类推*/
pa=c;
if(c->data>p->data) //此次比较是就root而言,应该向左还是向右创建,定个大方向
c=c->left;
else
c=c->right;
}
if(pa->data>p->data) //此次比较是和前驱直接比较,若小于前驱,为左子女结点,否则右子女结点,直接与前驱挂链
pa->left=p;
else
pa->righ t=p;
}
return root;
}