二叉树叶子节点个数

这篇博客介绍了如何使用C语言创建二叉树,包括先序遍历的实现以及计算二叉树中叶子节点数量的方法。通过示例代码展示了从输入字符构建二叉树,然后进行先序遍历打印节点位置,并计算并输出叶子节点个数的过程。
在这里插入代码片
#include "stdio.h"
#include "malloc.h"
typedef struct node{
	char data;
	struct node *lchild,*rchild;
}Tree ,*btree;
void creat(btree *t){
	char a;
	scanf("%c",&a);
	if(a==' '){
		*t=NULL;
	}else{
		*t=(btree)malloc(sizeof(btree));
		(*t)->data=a;
		creat(&((*t)->lchild));
		creat(&((*t)->rchild));
	}
}

//先序遍历:根节点,左子树,右子树 
void display(btree t,int len){
	if(t){
		printf("%c位于第%d层\n",t->data,len);
		qian(t->lchild,len+1);
		qian(t->rchild,len+1);
	}
}


//二叉树叶子节点个数
int leaf=0;
int leafnum(btree t){
	if(t){
		leafnum(t->lchild);//一直递归到左子树为空
		leafnum(t->rchild);
		if(t->lchild==NULL&&t->rchild==NULL){
			leaf++;
		}
	}
	return leaf;
}
int main(){
	btree t=NULL,t1;
	int len=1,ln;
	creat(&t);
	printf("二叉树:\n");
	printf("输出:\n");
	display(t,len);
	printf("\n");
	ln=leafnum(t);
	printf("二叉树叶子节点个数:%d\n",ln);
	printf("\n");
	return 0;
}
### 一、实验名称 数据结构实验之二叉树三:统计叶子数 ### 二、实验目的 输出二叉树叶子结点个数,通过实验加深对二叉树数据结构的理解,掌握二叉树的创建和遍历算法,特别是递归算法二叉树操作中的应用。 ### 三、实验环境 编程语言:C++ 开发环境:可支持 C++ 编译运行的环境,如 Dev - C++、Visual Studio 等 ### 四、实验原理 #### 1. 二叉树的定义 二叉树是每个节点最多有两个子树的树结构,通常子树被称作“左子树”和“右子树”。在代码中,使用结构体 `stu` 来表示二叉树节点,包含节点的数据 `data` 以及指向左子树和右子树的指针 `lchild` 和 `rchild`: ```cpp struct stu { int data; struct stu *lchild; struct stu *rchild; }; ``` #### 2. 二叉树的创建 采用递归的方式创建二叉树。从输入的字符序列中依次读取字符,如果字符为 `,` 表示该位置为空节点,否则创建一个节点,并递归地创建其左子树和右子树: ```cpp void creat(struct stu *&p) { char h = ch[l++]; if (h == ',') p = NULL; else { p = (struct stu *)malloc(sizeof(struct stu)); p->data = h; creat(p->lchild); creat(p->rchild); } } ``` #### 3. 统计叶子节点个数 叶子节点是指没有左子树和右子树的节点。通过递归遍历二叉树,若节点为空则返回 0,若节点为叶子节点则返回 1,否则返回其左子树和右子树的叶子节点个数之和: ```cpp int leave(struct stu *&p) { if (p == NULL) return 0; else if (p->lchild == NULL && p->rchild == NULL) return 1; else return (leave(p->lchild) + leave(p->rchild)); } ``` ### 五、实验步骤 1. **输入处理**:读取输入的字符序列,该序列用于表示二叉树的结构。 2. **二叉树创建**:调用 `creat` 函数,根据输入的字符序列递归地创建二叉树。 3. **统计叶子节点**:调用 `leave` 函数,递归地统计二叉树的叶子节点个数。 4. **输出结果**:将统计得到的叶子节点个数输出。 ### 六、实验代码 ```cpp #include<bits/stdc++.h> using namespace std; int l = 0; char ch[100]; struct stu { int data; struct stu *lchild; struct stu *rchild; }; void creat(struct stu *&p) { char h = ch[l++]; if (h == ',') p = NULL; else { p = (struct stu *)malloc(sizeof(struct stu)); p->data = h; creat(p->lchild); creat(p->rchild); } } int leave(struct stu *&p) { if (p == NULL) return 0; else if (p->lchild == NULL && p->rchild == NULL) return 1; else return (leave(p->lchild) + leave(p->rchild)); } int main() { struct stu *p; while (~scanf("%s", ch)) { l = 0; creat(p); int num = leave(p); printf("%d\n", num); } return 0; } ``` ### 七、实验结果与分析 #### 1. 测试用例 输入:`abc,,de,g,,f,,,` 输出:`3` #### 2. 结果分析 通过输入的字符序列创建二叉树,然后统计其叶子节点个数。在上述测试用例中,经过程序的处理,正确输出了二叉树的叶子节点个数为 3,说明程序的逻辑正确,能够实现统计二叉树叶子节点个数的功能。 ### 八、实验总结 本次实验通过创建二叉树并统计其叶子节点个数,深入理解了二叉树的递归创建和遍历算法。递归在处理树结构问题时具有简洁、高效的特点,但也需要注意递归的终止条件,避免出现栈溢出等问题。同时,对二叉树这种重要的数据结构有了更深刻的认识,为后续学习更复杂的树结构和算法奠定了基础。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值