题目描述
编一个程序,读入先序遍历字符串,根据此字符串建立一棵二叉树(以指针方式存储)。
例如如下的先序遍历字符串:
A ST C # # D 10 # G # # F # # #
各结点数据(长度不超过3),用空格分开,其中“#”代表空树。
建立起此二叉树以后,再按要求输出二叉树。
输入
输入由多组测试数据组成。
每组数据包含一行字符串,即二叉树的先序遍历,字符串长度大于0且不超过100。
输出
对于每组数据,显示对应的二叉树,然后再输出一空行。输出形式相当于常规树形左旋90度。见样例。 注意二叉树的每一层缩进为4,每一行行尾没有空格符号。
样例输入 Copy
A ST C # # D 10 # G # # F # # # 4 2 1 # # 3 # # 5 # 6 # #
样例输出 Copy
A F D G 10 ST C 6 5 4 3 2 1
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
// 定义二叉树节点的结构体
struct TreeNode {
std::string val; // 节点值
TreeNode* left; // 左子节点
TreeNode* right; // 右子节点
TreeNode(std::string x) : val(x), left(nullptr), right(nullptr) {} // 构造函数
};
// 根据先序遍历字符串构建二叉树
TreeNode* buildTree(std::istringstream& iss) {
std::string val;
// 读取当前节点的值,如果读取失败或值为"#",则返回空指针
if (!(iss >> val) || val == "#") {
return nullptr;
}
// 创建新节点
TreeNode* root = new TreeNode(val);
// 递归构建左子树
root->left = buildTree(iss);
// 递归构建右子树
root->right = buildTree(iss);
return root;
}
// 打印二叉树
void printTree(TreeNode* root, int depth = 0) {
if (root == nullptr) return; // 如果节点为空,直接返回
// 先打印右子树,增加深度
printTree(root->right, depth + 1);
// 打印当前节点的值,根据深度进行缩进
for (int i = 0; i < depth; ++i) {
std::cout << " ";
}
std::cout << root->val << std::endl;
// 打印左子树,增加深度
printTree(root->left, depth + 1);
}
// 删除二叉树,释放内存
void deleteTree(TreeNode* root) {
if (root == nullptr) return; // 如果节点为空,直接返回
// 递归删除左子树
deleteTree(root->left);
// 递归删除右子树
deleteTree(root->right);
// 删除当前节点
delete root;
}
// 主函数
int main() {
std::string line;
// 循环读取输入
while (std::getline(std::cin, line)) {
std::istringstream iss(line);
// 构建二叉树
TreeNode* root = buildTree(iss);
// 打印二叉树
printTree(root);
// 输出空行
std::cout << std::endl;
// 删除二叉树,释放内存
deleteTree(root);
}
return 0;
}
熟能生巧,时间与努力缺一不可