c++递归建立树,递归求树的节点数

这篇博客介绍了如何使用递归创建二叉树,并计算树的节点数。通过输入字符流构建二叉树,然后利用递归函数计算树的节点总数。递归公式为:左子树节点数 + 右子树节点数 + 1。程序在main函数中读取并展示树的节点数量。

递归建立树,递归求树的节点数

递归式子是左子树节点数+右子树节点数+1

#include<iostream>
#include<stack>
using namespace std;
int count=0;
struct Node{
	char data;
	Node *lchild;
	Node *rchild;
};
Node*createTree(){
	char x;
	cin>>x;
	if(x=='#')return NULL;
	Node *root=new Node;
	root->data=x;
	root->lchild=createTree();
	root->rchild=createTree();
	return root;
}
int NumOfNode(Node* root){
	if(root){
		count++;
		return NumOfNode(root->lchild)+NumOfNode(root->rchild)+1;
	}
	return 0;
} 
int main(){
	Node *root=createTree();
	int n=NumOfNode(root);
	cout<<"这棵树一共有"<<n<<"个节点。" <<endl;
	return 0;
}

在这里插入图片描述

### C++ 递归实现统计二叉节点数量的方法 #### 方法概述 通过递归方法可以高效地统计二叉中的叶节点数量。所谓叶节点是指那些既无左子节点也无右子节点的节点。此方法的核心在于判断当前节点是否为叶节点,如果是,则计数加一;如果不是,则分别对其左右子进行递归调用。 #### 实现细节 以下是基于C++的一个具体实现方案,其中包含了必要的数据结构定义以及递归函数的实际编码: ```cpp #include <iostream> using namespace std; // 定义二叉节点结构体 struct TreeNode { int value; // 节点值 TreeNode *left, *right; // 左右子节点指针 // 构造函数初始化节点值及其左右孩子的默认状态 TreeNode(int val) : value(val), left(NULL), right(NULL){} }; // 函数声明:获取给定根节点对应的二叉中所有的叶节点数目 int countLeafNodes(TreeNode* node){ if(node == NULL){ // 若当前节点为空,则直接返回0表示没有叶节点 return 0; } if(node->left==NULL && node->right==NULL){ // 当前节点既是叶节点的情况 return 1; }else{ // 否则继续向下寻找其他可能存在的叶节点 return countLeafNodes(node->left)+countLeafNodes(node->right); } } int main() { /* * 创建如下所示的一棵简单二叉用于演示: * * 1 * / \ * 2 3 * / * 4 */ TreeNode* root = new TreeNode(1); root->left = new TreeNode(2); root->right = new TreeNode(3); root->left->left = new TreeNode(4); cout << "Number of leaf nodes in the binary tree is: " << countLeafNodes(root) << endl; // 清理动态分配的空间以防内存泄露... delete root->left->left; delete root->left; delete root->right; delete root; return 0; } ``` 上述代码片段提供了一种简洁而优雅的方式去解决这个问题。它首先检查输入参数`node`是否指向有效的TreeNode实例;接着依据具体情况决定要么立即返回结果(即发现了一个新的叶节点),要么再次调用自己来探索剩余未被覆盖的部分[^1]。 --- #### 关键点解析 - **基础情形**:当某个特定路径上的最后一个节点满足条件——它的两个子节点都不存在时,我们就找到了一个叶节点。 - **组合逻辑**:对于非叶节点来说,我们需要把从它们各自的子那里获得的结果汇总起来形成最终答案。 - **边界情况处理**:考虑到极端情况下整个二叉可能是完全由单一节点构成或者根本就没有任何内容存在的情形,因此在最开始阶段就要做好相应的准备以便妥善应对这些特殊情况的发生[^2]. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值