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
文章出处登录后可见!
已经登录?立即刷新