根据带虚结点的先序序列建立二叉树,计算其度为2的结点个数后输出。 输入格式: 测试数据有多组,处理到文件尾。每组测试数据在一行中输入一个字符串(不含空格且长度不超过80),表示二叉树的先序遍历序列,其中字符*表示虚结点(对应的子树为空)。 输出格式: 对于每组测试,输出所建立的二叉树中度为2的结点个数。 输入样例: HDA**C*B**GF*E*** -+a**xb**-c**d**/e**f** 输出样例: 2 5用c++实现
时间: 2023-07-18 17:44:20 浏览: 325
利用C++实现二叉树的建立 首先通过建立节点类、然后通过递归算法建立整个二叉树,有增加、删除、查找等算法,有利于初步学习二叉树
下面是使用 C++ 实现根据带虚节点的先序序列建立二叉树,并计算度为2的节点个数的代码:
```cpp
#include <iostream>
#include <string>
using namespace std;
struct TreeNode {
char val;
TreeNode* left;
TreeNode* right;
TreeNode(char v): val(v), left(nullptr), right(nullptr) {}
};
// 根据带虚节点的先序序列构建二叉树
TreeNode* build_tree(string& s, int& i) {
if (i >= s.size() || s[i] == '*') {
++i;
return nullptr;
}
TreeNode* root = new TreeNode(s[i]);
++i;
root->left = build_tree(s, i);
root->right = build_tree(s, i);
return root;
}
// 计算度为2的节点个数
int count_degree_2_nodes(TreeNode* root) {
if (root == nullptr) {
return 0;
}
int count = 0;
if (root->left && root->right) {
++count;
}
count += count_degree_2_nodes(root->left);
count += count_degree_2_nodes(root->right);
return count;
}
int main() {
string s;
while (cin >> s) {
int i = 0;
TreeNode* root = build_tree(s, i);
cout << count_degree_2_nodes(root) << endl;
}
return 0;
}
```
代码中,`build_tree` 函数接收一个带虚节点的先序序列和一个引用参数 `i`,表示当前处理到序列中的第几个字符。如果当前字符为 `*` 或者序列已经处理完毕,则返回 `nullptr`。否则,创建一个新的节点,并递归构建其左右子树。最后返回根节点即可。
`count_degree_2_nodes` 函数计算二叉树中度为2的节点个数,使用递归方式实现。对于每个节点,判断其左右子树是否都存在,如果是,则当前节点的度数为2。最后递归遍历左右子树,并将度为2的节点个数累加起来即可。
在 `main` 函数中,使用 `build_tree` 函数构建二叉树,并使用 `count_degree_2_nodes` 函数计算度为2的节点个数,然后输出结果。循环处理多组数据,直到输入结束。
阅读全文