当前位置: 首页 > news >正文

c++可视化打印树

#include <iostream>
#include <string>// 定义节点结构体
struct Node {std::string data;Node* left;Node* right;Node(const std::string& data) : data(data), left(nullptr), right(nullptr) {}
};// 递归打印树
void printTree(Node* root, std::string indent = "") {if (root == nullptr) {return;}std::cout << indent << "|-- " << root->data << std::endl;if (root->left != nullptr) {std::string newIndent = indent + "   ";printTree(root->left, newIndent);}if (root->right != nullptr) {std::string newIndent = indent + "   ";printTree(root->right, newIndent);}
}int main() {// 创建树Node* root = new Node("A");root->left = new Node("B");root->right = new Node("C");root->left->left = new Node("D");root->left->right = new Node("E");root->right->left = new Node("F");root->right->right = new Node("G");// 打印树printTree(root);// 清理内存delete root;return 0;
}

这段代码定义了一个简单的二叉树结构体

Node和一个递归函数

printTree来打印树。它演示了如何使用C++创建和操作树形结构,并以可视化的方式打印出来。在

main函数中,我们创建了一棵树,并调用

printTree函数来打印它。最后,我们释放了为树节点分配的内存。

#include <iostream>
#include <string>
 
// 定义节点结构体
struct Node {
    std::string data;
    Node* left;
    Node* right;
 
    Node(const std::string& data) : data(data), left(nullptr), right(nullptr) {}
};
 
// 递归打印树
void printTree(Node* root, std::string indent = "") {
    if (root == nullptr) {
        return;
    }
    std::cout << indent << "|-- " << root->data << std::endl;
    if (root->left != nullptr) {
        std::string newIndent = indent + "   ";
        printTree(root->left, newIndent);
    }
    if (root->right != nullptr) {
        std::string newIndent = indent + "   ";
        printTree(root->right, newIndent);
    }
}
 
int main() {
    // 创建树
    Node* root = new Node("A");
    root->left = new Node("B");
    root->right = new Node("C");
    root->left->left = new Node("D");
    root->left->right = new Node("E");
    root->right->left = new Node("F");
    root->right->right = new Node("G");
 
    // 打印树
    printTree(root);
 
    // 清理内存
    delete root;
 
    return 0;
}

#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <queue>
#include <stack>
 
#define MAX 200
 
using namespace std;
 
typedef struct TreeNode {
    char c;
    int depth;
    struct TreeNode * FirstChild;
    struct TreeNode * NextSibling;
} *TREE, tree;
 
 
/* 传入参数为:
 * 层序输入的字符串
 * 根节点T(实际上没有存数据,深度已设为零) */
TREE BuildTree (char s[], TREE root) {
    queue <TREE> Q;
    stack <TREE> S;
 
    S.push(root);
    int depth = 0;  //用于更新当前遍历到的深度
 
    /* 将字母改成树的节点
     * 并依次将每个节点入队 */
    for(int i = 0; s[i] != '\0'; i++) {
        switch (s[i]) {
            case ',':
                break;
            case '(':
                depth++;
                break;
            case ')':
                depth--;
                break;
            default:   //只有可能为节点字母了
                TREE temp = (TREE)malloc(sizeof(tree));  //申请一个节点
                temp->c = s[i];
                temp->depth = depth;  //记录节点的深度
                temp->FirstChild = temp->NextSibling =NULL;
                Q.push(temp);  //节点入队
        }
    }
    /* 利用栈建树
     * 注意:最开始栈内已经加入一个元素root,其深度为0
     * 其他节点已经在队列中,深度 >= 1 */
    while(!Q.empty()) {
        //依次将队头节点与栈顶结点比较:
        if(Q.front()->depth > S.top()->depth) {
            S.top()->FirstChild = Q.front();  //队头挂在栈顶的左儿子
            S.push(Q.front());  //队头入栈
            Q.pop();  //出队
        }
        else if(Q.front()->depth == S.top()->depth) {
            S.top()->NextSibling = Q.front();  //队头挂在栈顶的右兄弟
            S.push(Q.front());  //队头入栈
            Q.pop();  //出队
        }
        else {
            //出栈,一直到栈顶节点深度不小于队头节点
            while (Q.front()->depth < S.top()->depth) {
                S.pop();
            }
        }
    }
    return root;
    /* root是传入的参数
     * 通过此函数 已经将待建立的树
     * 完整地挂在了root的左儿子上 */
}
 
/* 传入树的某个节点 */
void printLine(TREE T) {
    for (int i = 0; i < T->depth - 1; i++) {
        printf("    ");  //多一层则多四个空格凹进
    }
    printf("%c\n", T->c);
}
 
/* 传入树的根节点 */
void printTree(TREE root) {
 
    //递归的终点,空树不打印
    if (!root) {
        return;
    }
 
    //打印根节点
    printLine(root);
 
    /* 依次打印每个子树 */
    TREE p = root->FirstChild;
    while(p) {
        printTree(p);
        p = p->NextSibling;
    }
}
 
int main () {
    char s[MAX];
    scanf("%[^\n]",s);
    //gets(s);
 
    TREE T = (TREE) malloc(sizeof(tree));
    T->depth = 0;
    T->FirstChild = T->NextSibling = NULL;
 
    //建树
    TREE root = BuildTree(s, T)->FirstChild;
    //输出树
    printTree(root);
    return 0;
}

相关文章:

c++可视化打印树

#include <iostream> #include <string>// 定义节点结构体 struct Node {std::string data;Node* left;Node* right;Node(const std::string& data) : data(data), left(nullptr), right(nullptr) {} };// 递归打印树 void printTree(Node* root, std::string …...

ElementUI 快速入门:使用 Vue 脚手架搭建项目

文章目录 一 . ElementUI 的基本安装1.1 通过 Vue 脚手架创建项目1.2 在 vue 脚手架中安装 ElementUI1.3 编写页面 ElementUI 是 Vue.js 的强大 UI 框架&#xff0c;让前端界面开发变得简单高效。本教程将带你从安装到实战&#xff0c;快速掌握 ElementUI 的核心技巧。 核心内容…...

算法打卡:第十一章 图论part02

今日收获&#xff1a;岛屿数量&#xff08;深搜&#xff09;&#xff0c;岛屿数量&#xff08;广搜&#xff09;&#xff0c;岛屿的最大面积 1. 岛屿数量&#xff08;深搜&#xff09; 题目链接&#xff1a;99. 岛屿数量 思路&#xff1a;二维遍历数组&#xff0c;先判断当前…...

广度优先搜索算法及其matlab程序详解

#################本文为学习《图论算法及其MATLAB实现》的学习笔记################# 算法用途 广度优先搜索算法的应用 算法思想 广度优先搜索算法的步骤: ①,标号,令。 ②当所有标号为 的、与顶点 相关联的边的端点都已标号时,则停止;否则,把与 相关联的边的未标号的…...

力扣 438找到字符串中所有字母异位词

https://leetcode.cn/problems/find-all-anagrams-in-a-string/ 题目描述 题目分析 异位词所表示的空间 P \text{P} P 即一字符串的所有排列,记 s i \bold{s_i} si​为以 s [ i ] s[i] s[i]开头的长度为 plen \text{plen} plen的 s s s子串 故本题可理解为求解 A n s Ans Ans…...

图像滤波---各项异性扩散滤波使用笔记及代码

图像滤波---各项异性扩散滤波使用笔记及代码 一、文章内容介绍二、各项异性扩散滤波和各项同性滤波1、各项同性滤波2、各项异性扩散滤波3、各项异性和各项同性的对比 三、各项异性扩散滤波的原理介绍四、各项异性扩散滤波公式五、公式中的参数使用说明1、扩散速率 λ \lambda λ…...

用Go语言构建健壮的并发系统:深入理解错误传播与处理

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在当今的软件开发中,构建并发和分布式系统已经成为常态。然而,在这些系统中,错误的发生频率高且定位困难。如果我们能够深入考虑错误如何在系统中传播,以及最终如何呈现给用户,那么我们就能为自己、团队和用…...

掌握C#中的动态规划技术

C# 中的动态规划&#xff08;Dynamic Programming, DP&#xff09;是一种在数学、计算机科学和经济学中使用的&#xff0c;通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划通常用于优化问题&#xff0c;特别是那些具有重叠子问题和最优子结构性质的问题…...

C语言进阶【5】---数据在内存中的存储【2】(小数存储很难吗?)

本章概述 本章引要练习 浮点数的存储浮点数的取出小补充题目解析彩蛋时刻&#xff01;&#xff01;&#xff01; 本章引要 常见的浮点数&#xff1a;3.1415&#xff0c;1E10等。其中&#xff0c;1E10是科学计数法的形式&#xff0c;它也就等于1*10^10。小数数据类型&#xff1…...

如何更新至CDS-Beta下载ERA5数据

数据下载网站 api 更新 api setup 更新api 2024年9月26日起老版的CDS将被停用&#xff0c;会搬迁到CDS-beta上。 创建一个新的CDS-beta账户&#xff0c;也可以使用之前的ECMWF账户。https://cds-beta.climate.copernicus.eu/vi ~/.cdsapirc &#xff0c;登陆https://cds-bet…...

SQL编程题复习(24/9/20)

练习题 x25 10-120 统计每个班级期末成绩的最高分&#xff08;Max&#xff09;&#xff0c;显示班级名称、期末最高成绩10-121 显示没有班导师的班级名称、院系名称10-122 将电子信息1班(班级编号&#xff1a;08)的班主任编号改为李丽清老师的编号&#xff08;PTA题目表述错误&…...

react crash course 2024 (1)理论概念

state的作用 react hooks 而无需写一个class jsx 样式用 spa...

有关JS下隐藏的敏感信息

免责声明&#xff1a;本文仅做分享&#xff01; 目录 JavaScript 介绍 核心组成 工具 FindSomething ** 浏览器检查 ** LinkFinder URLfinder ** SuperSearchPlus ** ffuf ParasCollector waymore Packer Fuzzer JS逆向 应用&#xff1a; 小结&#xff1a; Ja…...

Kafka 基于SASL/SCRAM动态认证部署,kafka加账号密码登录部署

文章目录 前言下载 kafka安装启动zookeeper添加账号密码 启动kafka修改kafka配置文件增加jaas授权文件修改启动文件&#xff0c;启动kafka检查是否部署成功 offset explore 连接 前言 其实挺简单的几个配置文件&#xff0c;问大模型一直没说到点上&#xff0c;绕晕了。SASL/SC…...

富格林:积攒经验阻挠欺诈套路

富格林指出&#xff0c;现货黄金这些年可谓是表现出色&#xff0c;相信上车现货黄金的投资者&#xff0c;都或多或少分得一杯满意的羹。不过话又说回来&#xff0c;不是所有投资者都可以轻松在现货黄金中获利&#xff0c;尤其是对投资小白而言&#xff0c;如果没有积累知识阻挠…...

51单片机-红外遥控器(NEC标准)-实验(红外遥控及调速电机)

作者&#xff1a;Whappy 时间&#xff1a;2024.9.20 总结一下&#xff01;基础实验到这儿里就圆满结束&#xff0c;历经25天&#xff0c;将51单片机学完并亲自手敲代码近5000行&#xff0c;在手敲代码过程中&#xff0c;明显感觉的看和敲&#xff0c;明显就是不同的感觉&…...

云手机的便捷性和安全性体现在哪?

随着5G技术的迅速发展&#xff0c;云手机在游戏、电商以及新媒体营销等领域中的应用日益广泛。它不仅能够显著降低成本、提升效率&#xff0c;还随着边缘计算和云技术的进步&#xff0c;展现出无限的增长潜力。 云手机的便捷性体现在哪里&#xff1f; 云手机的便捷性毋庸置疑。…...

漫谈由标准输入\输出\错误输出引发的思考

标准输入|输出|错误输出 在Unix\Linux体系中&#xff0c;一个进程通常自带有标准输入、标准输出、标准错误输出等三个文件描述符。 如果从对称的观点来看&#xff0c;它确实长的有点奇怪&#xff0c;但它背后隐藏了什么样的知识和道理呢&#xff1f; 从图灵机模型谈起 以前…...

利用 IDEA 快速管理 k8s 集群

简介 前置条件&#xff1a; minikube 已安装&#xff0c;JetBrains k8s 官方插件已安装&#xff0c;Helm 已安装&#xff0c;kubectl 已安装 打开插件面板 检查可执行文件 添加配置文件 添加集群 验证...

【自然语言处理】实验三:新冠病毒的FAQ问答系统

目录 前言 1.新建data_process.py 1.1导入包并定义功能模块1用来读取问题和答案FAQ的文件 1.2功能模块2&#xff1a;进行问题/问题列表处理&#xff08;正则化&#xff0c;分词&#xff09; 1.3功能模块3&#xff1a;处理输入的问题 1.4功能模块4&#xff1a;计算输入问题与问题…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...