您的位置:首页 > 其它

求森林叶子结点数

2015-05-08 20:48 393 查看
本文以孩子兄弟表示法存储森林,列出求森林叶子结点的递归与非递归算法。
#include "stdio.h"
#include "malloc.h"

typedef struct CSNode
{
int data;
struct CSNode *lchild, *rbrother;
}CSNode, *Tcsnode;

typedef struct
{
Tcsnode data[50];
int front, rear;
}queue;

void create(Tcsnode &T);            //先序创建森林
void postorder(Tcsnode T);          //后序遍历
void leave1(Tcsnode T);             //非递归求叶子结点数
int leave2(Tcsnode T);              //递归求叶子结点数

int main()
{
int k;
Tcsnode T;
printf("孩子兄弟表示法先序创建森林:\n");
create(T);
printf("后序遍历:\n");
postorder(T);
printf("\n");
leave1(T);
k = leave2(T);
printf("该森林叶子结点数为%d!\n", k);

return 0;
}
//先序创建二叉树
void create(Tcsnode &T)
{
int a;
scanf("%d", &a);
if((a != 0))
{
T = (Tcsnode)malloc(sizeof(CSNode));
T->data = a;
create(T->lchild);
create(T->rbrother);
}
else
T = NULL;
}
//中序遍历二叉树,即后序遍历森林,两棵树之间通过换行符隔开
void postorder(Tcsnode T)
{
if(T != NULL)
{
postorder(T->lchild);
printf("%d ", T->data);
if(T->data == 1)      //1为第一棵树的根结点
printf("\n");
postorder(T->rbrother);
}
}
//非递归算法求森林叶子结点,即求该二叉树无左子树的结点数
void leave1(Tcsnode T)
{
int k = 0;
Tcsnode p;
queue q;
q.front = q.rear = -1;
if(T == NULL)
printf("该森林叶子结点数为0!\n");
else
{
q.data[++q.rear] = T;
while(q.front < q.rear)
{
p = q.data[++q.front];
if(p->lchild != NULL)
q.data[++q.rear] = p->lchild;
else
k++;
if(p->rbrother != NULL)
q.data[++q.rear] = p->rbrother;
}
printf("该森林叶子结点数为%d!\n", k);
}
}
//递归算法求森林叶子结点
int leave2(Tcsnode T)
{
if(T == NULL)
return 0;
if(T->lchild == NULL)
return leave2(T->rbrother) + 1;
else
return leave2(T->lchild) + leave2(T->rbrother);
}


运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息