1.先序递归建立二叉树
首先要判断当前节点是否为空节点,不是空节点才可以往下进行;
判断好了节点不为空,就可以为根节点申请内存空间了,并为根节点的数据域赋值;
因为这是先根建立二叉树,先根的顺序就是根,左,右,根的问题解决完了,就要解决左子树的建立问题了;
T->lchild=CBT();让它进行递归,回到第一步,判断当前节点是否为空节点......吧啦吧啦......
大概就是介个样子,右子树也是介个样子;
最后,再返回根节点,这可二叉树就建立完成了,是不是很简单?如果还是不理解,画一画图,就好啦,实践出真知
typedef char ElemType;
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;//左右孩子指针;
}BiTNode,*BiTree;
BiTree CBT()
{//先序递归建立二叉树;
char ch;
BiTree T;//根节点
scanf("%c",&ch);
if(ch=='#') return NULL;
T=(BiTree)malloc(sizeof(BiTNode));//为根节点申请空间;
T->data=ch;//为根节点的数据域赋值;
T->lchild=CBT();//建立左子树
T->rchild=CBT();//建立右子树;
return T;//返回根节点;
}
2.前序中序递归建立二叉树
啰嗦一下,前序就是遍历二叉树时先遍历根,再左子树,再右子树,即先遍历根;而中序就是左子树,根,右子树,中间遍历根节点;
拿个例子来说一下:
先序序列:abdegcf
中序序列:dbgeafc
我们可以根据先序序列来确定这棵二叉树的根,即a,
abdegcf
然后在中序序列中根左边的序列即为左子树的元素,根右边的序列即为右子树的元素
dbgeafc
根据bdeg(先序)和dbge(中序)确定左子树
根据eg(先序)和ge(中序)确定左子树的右子树
根据cf(前序)和fc(中序)确定右子树
所以最后就是酱紫的啦,看下面
BiTree CBT(char *s1,char *s2,int len)
{//前序中序递归建立二叉树
if(len<=0) return NULL;
BiTree T;
T=(BiTree)malloc(sizeof(BiTNode));
T->data=*s1;//先根序列的第一个节点即为根节点;
char *x;
//int l=strchr(s2,s1[0])-s2;
for(x=s2;x!=NULL;x++)//查找中根序列中根的位置;
if(*x==*s1)
break;
int l=x-s2;//求左子树长度;
T->lchild=CBT(s1+1,s2,l);//建立左子树;
T->rchild=CBT(s1+l+1,x+1,len-l-1);//建立右子树;
return T;
}
3.中序后序递归建立二叉树
中后跟前中的道理是一样的唯一的改变就是前序在第一个是根,后序在最后一个位置是根;
中序序列:bdgeafc
后序序列:dgebfca
bdgeafc(中) dgebfca(后)
此处不作一一赘述,参考前序中序建树;
BiTree CBT(char *s1,char *s2,int len)
{//中序后序递归建立二叉树
if(len<=0) return NULL;
BiTree T;
T=(BiTree)malloc(sizeof(BiTNode));
T->data=*(s2+len-1);//后根序列的最后一个节点即为根节点;
int l=strchr(s1,s2[len-1])-s1;//包含在string.h下;
//返回字符在字符串中出现的首地址;
T->lchild=CBT(s1,s2,l);
T->rchild=CBT(s1+l+1,s2+l,len-l-1);
return T;
}