//1、 根据下列程序环境的设置,补充完整二叉树的二叉链表结点结构体的定义。
#include "stdio.h"
#define OK 1
#define ERROR 0
typedef int status;
//下面是二叉树相关的定义
#define MAX 20
typedef char Telemtype;
typedef struct BTnode
{
Telemtype data;
struct BTnode *lchild;
struct BTnode *rchild;
}BTnode,*Btree;
//2、 在第1题的基础上,补充完整下面的先序创建二叉树函数。
Btree create(Btree &T)
{
char ch;
scanf("%c",&ch);
if(ch=='#') T=NULL;
else
{
T=new BTnode;
T->data=ch;
create(T->lchild);
create(T->rchild);
}
return T;
}
//3、 在第1和第2题的基础上,编写先序、中序和后序遍历二叉树的函数。
/* 先序*/
int pre_display(Btree T)
{
if(T)
{
printf("%3c",T->data);
pre_display(T->lchild);
pre_display(T->rchild);
}
return OK;
}
/* 中序*/
int in_display(Btree T)
{
if(T!=NULL)
{
in_display(T->lchild);
printf("%3c",T->data);
in_display(T->rchild);
}
return OK;
}
/* 后序*/
int post_display(Btree T)
{
if(T){
post_display(T->lchild);
post_display(T->rchild);
printf("%3c",T->data);
}
return OK;
}
status PNodeK(Telemtype &e,int &k,Btree T)
{
if(T){
k--;
if(k==0){
e=T->data;
return OK;
}
if(T->lchild==NULL&&T->rchild==NULL)
return OK;
PNodeK(e,k,T->lchild);
PNodeK(e,k,T->rchild);
}
}
//4、 编写求二叉树叶子结点数的函数。
int leavecount(Btree T) //求叶子结点数
{
int n;
if(T==NULL) return 0;
if(T->lchild == NULL && T->rchild ==NULL) return 1;
else n=leavecount(T->lchild)+leavecount(T->rchild);
return n;
}
//5、输入主函数对上面各个函数实现调用,记录并分析程序的运行结果。
int main()
{
Btree T=NULL;
Telemtype e=0;
int k;
int n;
printf("输入按先序创建二叉树的序列,如:ABC##DE#G##F###\n");
if(T=create(T))
{
printf("先序遍历OK\n");
pre_display(T);
printf("\n中序遍历OK\n");
in_display(T);
printf("\n后序遍历OK\n");
post_display(T);
n=leavecount(T);
printf("\n叶子结点数n=%d \n",n);
}
else
printf("ERROR");
printf("请输入位置K?");
scanf("%d",&k);
int m=k;
PNodeK(e,k,T);
if(e!=0)
printf("先序遍历中,第%d个位置的值是:%c",m,e);
else printf("未找到!");
}