当前位置: 首页 > 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;计算输入问题与问题…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...