叶子结点和分支节点_统计二叉树分支及叶子结点的个数

该博客介绍了一种使用二叉链表存储结构来统计二叉树中叶子结点和分支结点数量的方法。通过先序遍历创建和输出二叉树,并实现菜单驱动的程序,用户可以选择统计叶子结点或分支结点的个数。程序包括创建二叉树、先序遍历输出、统计叶子结点和分支结点的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以二叉链表存储结构存储二叉树,统计分支结点及叶子个数。

(1)从键盘输入扩展的先序结点数据,以二叉链表存储该二叉树。

(2)统计叶子结点个数。

(3)统计分支节点个数。

(4)要求程序通过一个主菜单进行控制,通过选择菜单项序号调用各功能函数。#include 

#include 

#include 

#define ERROR 0

#define OK 1

#define FALSE -1

#define TRUE 1

#define maxSize 100

typedef struct node//二叉树数据结构

{

char data;

struct Node *LChild;

struct Node *RChild;

}BiNode,*BiTree;

int menu_select();//菜单驱动程序

void DeleteBitree(BiTree root);//先序遍历输出二叉树的结点

void CreateBiTree(BiTree * bt);//先序遍历创建二叉树

int leaf(BiTree root);//后续遍历统计叶子结点数目

void PreOrder(BiTree root);//先序遍历输出二叉树的结点

int menu_select()//菜单驱动程序

{

int sn;

printf("实验三运行系统\n");//显示菜单

printf("==============================\n");

printf("1、二叉树的建立\n");

printf("2、统计叶子结点个数并输出\n");

printf("3、统计分支结点的个数并输出\n");

printf("4、输出二叉树中的结点\n");

printf("0、退出系统\n");

printf("==============================\n");

printf("请选择0--4:");

for(;;)//菜单功能选择

{

scanf("%d",&sn);

getchar();

if(sn<0 || sn>4)

printf("\n\t输入选择错误,请重新选择0--4:");

else

break;

}

return sn;

}

/*

TODO:创建二叉树

功能描述:编写代码,使之从键盘输入扩展的先序结点数据,建立二叉树,空节点用“.”表示输入

举例:输入AB..C.. 即可建立以A为父节点,BC为子节点的二叉树

参数:定义*bt BiTree类型的指针

*/

void CreateBiTree(BiTree *bt)

{

char ch;

scanf("%c",&ch);

if(ch=='.') *bt=NULL;

else{

*bt=(BiTree)malloc(sizeof(BiNode));

(*bt)->data=ch;

CreateBiTree(&((*bt)->LChild));

CreateBiTree(&((*bt)->RChild));

}

}

void PreOrder(BiTree root)//输出二叉树

{

if(root != NULL)

{

printf("%c",root->data);

PreOrder( root->LChild);

PreOrder( root->RChild);

}

}

void DeleteBitree(BiTree root)//清空二叉树

{

if(root != NULL)

return;

{

DeleteBitree( root->LChild);

DeleteBitree( root->RChild);

free(root);

}

return;

}

/*

TODO:统计叶子节点个数

功能描述:后续遍历统计叶子结点数目

参数:root为指向二叉树根结点的指针

返回值:最终返回叶子节点数LeafCount

*/

int leaf(BiTree root)

{

int count;

if(root==NULL) count=0;

else if(root->LChild==NULL&&root->RChild==NULL) count=1;

else count=leaf(root->LChild)+leaf(root->RChild);

return count;

}

/*

TODO:统计分支节点个数

功能描述:计算并统计分支节点个数

参数:root为指向二叉树根结点的指针

返回值:最终返回分支节点个数即可

*/

int BranchCount(BiTree root)

{

if(root==NULL) return 0;

else{

if(root->LChild||root->RChild)

return BranchCount(root->LChild)+1+BranchCount(root->RChild);

else return 0;

}

}

void main()

{

BiTree root,bt;

int leafcount;

int branchcount;

for(;;) // 无限循环,选择0 退出

{

switch(menu_select()) // 调用菜单函数,按返回值选择功能函数

{

case 1:

printf("二叉树的建立\n");

DeleteBitree(&bt);//先序遍历输出二叉树的结点

CreateBiTree(&bt);//先序遍历创建二叉树

break;

case 2:

printf("统计叶子结点个数并输出\n");

leafcount=leaf(bt);//后续遍历统计叶子结点数目

printf("叶子结点的数目为%d\n",leafcount);

break;

case 3:

printf("统计分支结点个数并输出\n");

branchcount=BranchCount(bt);

printf("分支结点的数目为%d\n",branchcount);

break;

case 4:

printf("输出二叉树中的结点\n");//输出通讯者信息的函数调用

PreOrder(bt);//先序遍历输出二叉树的结点

break;

case 0:

printf("再见!\n");//退出系统

return;

} // switch语句结束

} // for循环结束

} // main()函数结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值