以二叉链表作为二叉树的存储结构,求二叉树的叶子结点个数。
输入格式:
输入二叉树的先序序列。
提示:一棵二叉树的先序序列是一个字符串,若字符是‘#’,表示该二叉树是空树,否则该字符是相应结点的数据元素。
输出格式:
输出有两行:
第一行是二叉树的中序遍历序列;
第二行是二叉树的叶子结点个数。
输入样例:
ABC##DE#G##F###
输出样例:
CBEGDFA
3
代码如下
#include <iostream>
using namespace std;
// 二叉树节点的定义
struct TreeNode {
char data;
TreeNode* left;
TreeNode* right;
TreeNode(char x) : data(x), left(nullptr), right(nullptr) {}
};
// 根据先序序列构建二叉树
TreeNode* buildTree(string preorder, int& index) {
if (index >= preorder.length()) {
return nullptr;
}
char ch = preorder[index++];
if (ch == '#') {
return nullptr;
}
TreeNode* root = new TreeNode(ch);
root->left = buildTree(preorder, index);
root->right = buildTree(preorder, index);
return root;
}
// 中序遍历二叉树
void inorderTraversal(TreeNode* root) {
if (root == nullptr) {
return;
}
inorderTraversal(root->left);
cout << root->data;
inorderTraversal(root->right);
}
// 求二叉树叶子节点个数
int countLeaves(TreeNode* root) {
if (root == nullptr) {
return 0;
}
if (root->left == nullptr && root->right == nullptr) {
return 1;
}
return countLeaves(root->left) + countLeaves(root->right);
}
int main() {
string preorder;
cin >> preorder;
int index = 0;
TreeNode* root = buildTree(preorder, index);
inorderTraversal(root);
cout << endl;
cout << countLeaves(root) << endl;
return 0;
}