二叉树叶子结点个数统计(两种思路)

该文提供了一种计算二叉树中叶子节点数量的方法,包括通过递归和广度优先遍历两种算法实现。给定一棵二叉树的先序遍历字符串,程序会构建二叉树并输出其叶子节点的数量。

1.问题描述:

输入一棵二叉树,求出其叶子结点个数

2.要求:

(1)设计二叉树的存储结构

(2)设计求叶子结点个数的递归算法

(3)用户输入的一串先序遍历字符串为二叉树节点

(4)输出二叉树的叶子节点个数

示例:

输入先序遍历的二叉树节点:abc##de#g##f###

二叉树叶子结点个数为:3

树的原型:

这一题有两种思路:

                                1.左右子树递归查找(dfs)

                                2.广度优先遍历查找(bfs)

下面代码展示来两种不同方法:

#include<iostream>
#include<queue>
using namespace std;

string str;//先序遍历字符串
int i = 0;//下标
typedef char DataType;//树中数据类型

typedef struct TreeNode {
	DataType val;
	struct TreeNode* left;
	struct TreeNode* right;
	TreeNode(DataType data) :val(data), left(NULL), right(NULL) {};
}TNode;

TNode* Create_Tree() {
	char ch = str[i++];
	if (ch == '#') return NULL;//说明节点为空 返回上一级函数
	
	TNode* root = new TNode(ch);//创建根节点
	root->left = Create_Tree();//创建左子树
	root->right = Create_Tree();//创建右子树
	return root;
}

//递归左右子树查找叶子结点
int Tree_LeafSize1(TNode* root) {
	if (!root) return 0;//如果节点为空 叶子结点0 返回上一级函数
	if (!root->left && !root->right) return 1;//满足叶子结点条件 叶子结点为1 返回上一级函数
	return Tree_LeafSize1(root->left) + Tree_LeafSize1(root->right);//递归遍历左右子树
}

//广度优先遍历查找叶子结点
int Tree_LeafSize2(TNode* root) {
	int res = 0;
	queue<TNode*> Q;
	Q.push(root);
	while (!Q.empty()) {
		TNode* t = Q.front();
		Q.pop();
		if (t->left) Q.push(t->left);
		if (t->right) Q.push(t->right);
		if (!t->left && !t->right) res++;//叶子结点
	}
	return res;
}

int main() {
	cin >> str;//输入先序遍历字符串
	TreeNode* root = Create_Tree();//构建二叉树
	cout<<"Tree_LeafSize1:" << Tree_LeafSize1(root)<<endl;//3
	cout<<"Tree_LeafSize2:" << Tree_LeafSize2(root);//3
	return 0;
}
abc##de#g##f###
Tree_LeafSize1:3
Tree_LeafSize2:3

### 叶子结点统计方法 在一个二叉树中,叶子结点是指没有左孩子也没有右孩子的结点。为了统计叶子结点的数量,可以采用递归的方式实现。具体逻辑如下: 当当前结点为空时返回 `0`;如果当前结点既无左孩子也无右孩子,则该结点是一个叶子结点,此时返回 `1` 并加上其左右子树中的叶子结点数量[^5]。 以下是用于统计叶子结点个数的代码示例: ```c int LeafCount(BiTree T) { if (!T) return 0; if (!(T->lchild) && !(T->rchild)) return 1; // 当前结点为叶子结点 return LeafCount(T->lchild) + LeafCount(T->rchild); } ``` --- ### 输出所有叶子结点的方法 要按某种顺序输出所有的叶子结点,可以选择不同的遍历方式来访问这些结点。通常情况下会使用 **先序遍历** 或者其他形式的深度优先搜索(DFS)。对于每棵子树,判断当前结点是否为叶子结点,如果是就将其打印出来[^4]。 下面是基于先序遍历输出叶子结点的代码实现: ```c void PreorderPrintLeaves(BiTree T) { if (!T) return; if (!(T->lchild) && !(T->rchild)) { // 判断是否为叶子结点 printf(" %c", T->data); // 打印叶子结点的数据部分 } PreorderPrintLeaves(T->lchild); // 遍历左子树 PreorderPrintLeaves(T->rchild); // 遍历右子树 } ``` 上述代码通过递归调用实现了对整个二叉树的扫描,在遇到叶子结点时执行相应的操作(这里是打印)。 --- ### 结合功能的完整程序框架 下面提供了一个完整的 C 程序框架,其中包含了两个主要的功能模块——统计叶子结点数目以及按照先序遍历输出所有叶子结点的内容。 ```c #include <stdio.h> #include <stdlib.h> typedef struct TreeNode { char data; struct TreeNode *lchild, *rchild; } BiTreeNode, *BiTree; // 功能一:计算叶子结点个数 int LeafCount(BiTree T) { if (!T) return 0; if (!(T->lchild) && !(T->rchild)) return 1; return LeafCount(T->lchild) + LeafCount(T->rchild); } // 功能二:先序遍历输出叶子结点 void PreorderPrintLeaves(BiTree T) { if (!T) return; if (!(T->lchild) && !(T->rchild)) { printf(" %c", T->data); } PreorderPrintLeaves(T->lchild); PreorderPrintLeaves(T->rchild); } // 测试函数 int main() { // 假设已经构建好了一颗二叉树 root BiTree root = NULL; // 初始化根节点 // 构建测试用的简单二叉树... int leafNum = LeafCount(root); printf("\nLeaf count is: %d\n", leafNum); printf("Leaves in preorder:"); PreorderPrintLeaves(root); printf("\n"); return 0; } ``` 此代码片段展示了如何定义基本的二叉树结构体类型,并提供了两种核心算法的具体实现。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值