小白一枚,做习题的时候做到了,我把我的答案贴出来,如果有需要的同学可以参考一下
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#define OK 1
#define ERROR 0
//首先,构建二叉链表的结构体
typedef struct BiList{
int data;
struct BiList *Lchild,*Rchild;
}BiList,*BiLinkList;
//第二,初始化一个二叉链表,方便最后验证功能是否实现
int InitBiList(BiLinkList &B,int e){
B=new BiList;
B->data=e;
B->Lchild=NULL;
B->Rchild=NULL;
return OK;
}
//遍历函数:这个是对二叉链表进行遍历的函数,非终端节点个数用n返回
int VBiList(BiLinkList &B,int &n){
if(!B->Lchild&&!B->Rchild){
return OK;
}
printf("根:%d\n",B->data);
n++;
if(B->Lchild){
VBiList(B->Lchild,n);
}
if(B->Rchild){
VBiList(B->Rchild,n);
}
return OK;
}
//对二叉链表进行添加孩子的函数,这里把它写成手动添加,其主要目的是验证遍历函数使用,不是重点
int InLinkList(BiLinkList &B,char a[],int e){
BiList *temp=B;
BiList *p;
p=new BiList;
p->data=e;
p->Rchild=NULL;
p->Lchild=NULL;
if(strcmp(a,"L")==0){
temp->Lchild=p;
temp=temp->Lchild;
printf("插入成功\n");
return OK;
}
if(strcmp(a,"R")==0){
temp->Rchild=p;
temp=temp->Rchild;
printf("插入成功\n");
return OK;
}
return ERROR;
}
int main(){
int n=0;
/* 这些都是构建一个二叉链表,方便我们验证是否成功 */
BiList *B,*temp;
InitBiList(B,5);
char L[]="L";
char R[]="R";
InLinkList(B,L,6);
InLinkList(B,R,7);
temp=B->Lchild;
InLinkList(temp,L,8);
InLinkList(temp,R,9);
temp=B->Rchild;
InLinkList(temp,L,10);
InLinkList(temp,R,11);
/*我们的重点,遍历函数,最后输出n查看计数器是否正确*/
VBiList(B,n);
printf("%d\n",n);
}
图为我们构建的二叉链表
运行结果:
初学者,只能做到简单的实现,没有考虑便捷以及高效性,欢迎各位同学提出宝贵的建议=o=