对任意的二叉树的结点结构都可以设置为如下结构,leftChild指向该结点的左孩子,rightChild指向右孩子,data域记录结点信息,以此结点结构形成的二叉树称为二叉链表。
存储结构类型为
typedef char Elemtype;
typedef struct Node{
Elemtype data;
struct Node * LChild;
struct Node * RChild;
}BiTNode,*BiTree;
以二叉树的广义表的形式创建,测试用例为"a(b(c,d(e,f)),i(j,k(x,y)))",基本思路是,将每个元素存入结点中,并根据标志变量判断是放入前结点的左孩子还是右孩子,后将‘(’后的结点压入栈中和标志置1,遇到‘)‘则出栈,’,‘则说明下个结点是父结点的右孩子,标志置0,以下为代码
BiTNode *CreateBiTNode(char *str){
char ch;int top=-1,k,j=0;
BiTNode *bt=NULL,*stack[200],*p=NULL;
ch=str[j];
while(ch!='\0'){
switch(ch){
case '(':
top++;
stack[top]=p;
k=1;
break;
case ',':
k=2;
break;
case ')':
top--;
break;
default:
p=(BiTNode *)malloc(sizeof(BiTNode));
p->data=ch;
p->LChild=p->RChild=NULL;
if(bt==NULL){
bt=p;
}else{
if(k==1){
stack[top]->LChild=p;
}else{
stack[top]->RChild=p;
}
}
break;
}
j++;ch=str[j];
}
return bt;
}
遍历分为先中后序遍历,思想都差不多,就直接贴出前序遍历测试代码
#include<stdio.h>
typedef char Elemtype;
typedef struct Node{
Elemtype data;
struct Node * LChild;
struct Node * RChild;
}BiTNode,*BiTree;
BiTNode *CreateBiTNode(char *str){
char ch;int top=-1,k,j=0;
BiTNode *bt=NULL,*stack[200],*p=NULL;
ch=str[j];
while(ch!='\0'){
switch(ch){
case '(':
top++;
stack[top]=p;
k=1;
break;
case ',':
k=2;
break;
case ')':
top--;
break;
default:
p=(BiTNode *)malloc(sizeof(BiTNode));
p->data=ch;
p->LChild=p->RChild=NULL;
if(bt==NULL){
bt=p;
}else{
if(k==1){
stack[top]->LChild=p;
}else{
stack[top]->RChild=p;
}
}
break;
}
j++;ch=str[j];
}
return bt;
}
//前序遍历
void Preorder(BiTNode *bt){
if(bt!=NULL){
printf("%c",bt->data);
Preorder(bt->LChild);
Preorder(bt->RChild);
}
}
int main(){
BiTNode *bt=NULL;
char *str="a(b(c,d(e,f)),i(j,k(x,y)))";
bt=CreateBiTNode(str);
Preorder(bt);
}