问题 N: 二叉树的创建和文本显示

题目描述

编一个程序,读入先序遍历字符串,根据此字符串建立一棵二叉树(以指针方式存储)。
例如如下的先序遍历字符串:
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;
}

熟能生巧,时间与努力缺一不可

  • 13
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值