给定一个二叉树的前序遍历字符串,当节点为 NULL 时,它的输出为 “-”。请创建一个与字符串对应的二叉树。请计算树的高度并计算树中叶节点的数量。写一个C++
时间: 2024-09-30 15:12:10 浏览: 26
给定前序遍历字符串构建二叉树,首先需要理解前序遍历的顺序:根节点 -> 左子树 -> 右子树。我们可以按照这个顺序递归地构造二叉树。对于每个字符,我们将其作为当前结点的值,然后根据遇到的“-”分隔符找到左右子节点的位置。
在 C++ 中,你可以这样做:
```cpp
#include <iostream>
#include <vector>
class TreeNode {
public:
char val;
TreeNode *left;
TreeNode *right;
TreeNode(char v) : val(v), left(NULL), right(NULL) {}
};
std::pair<TreeNode*, std::vector<int>> buildTree(std::string s, int &i) {
if (s[i] == '-') { // 遇到空节点
i++; // 移动到下一个字符
return {nullptr, {}};
}
TreeNode* root = new TreeNode(s[i++]); // 创建新节点并保存索引
// 递归处理左子树和右子树
auto [left, l叶数] = buildTree(s, i);
auto [right, r叶数] = buildTree(s, i);
root->left = left; // 连接左右子树
root->right = right;
// 返回当前节点及其叶节点计数
return {root, l叶数 + (right ? r叶数 : 0)};
}
int height(TreeNode* root) {
if (!root) return 0;
int leftHeight = height(root->left);
int rightHeight = height(root->right);
return std::max(leftHeight, rightHeight) + 1;
}
int countLeaves(TreeNode* root) {
if (!root) return 0;
return root->left ? countLeaves(root->left) + countLeaves(root->right) : 1;
}
int main() {
std::string preorderTraversal = "9-2-4-5-7-8-6-3-10";
int i = 0;
auto [root, leafCount] = buildTree(preorderTraversal, i);
int treeHeight = height(root);
std::cout << "Root value: " << root->val << "\n";
std::cout << "Height of the tree: " << treeHeight << "\n";
std::cout << "Number of leaves: " << leafCount << "\n";
return 0;
}
```
在这个程序中,`buildTree` 函数用于从输入的字符串生成二叉树,`height` 计算树的高度,`countLeaves` 计算叶节点的数量。`main` 函数展示了如何使用这些函数。
阅读全文