c++可视化打印树

cpp 复制代码
#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;

}

相关推荐
Monly214 分钟前
Java(若依):修改Tomcat的版本
java·开发语言·tomcat
boligongzhu5 分钟前
DALSA工业相机SDK二次开发(图像采集及保存)C#版
开发语言·c#·dalsa
Eric.Lee20215 分钟前
moviepy将图片序列制作成视频并加载字幕 - python 实现
开发语言·python·音视频·moviepy·字幕视频合成·图像制作为视频
小俊俊的博客6 分钟前
海康RGBD相机使用C++和Opencv采集图像记录
c++·opencv·海康·rgbd相机
7yewh7 分钟前
嵌入式Linux QT+OpenCV基于人脸识别的考勤系统 项目
linux·开发语言·arm开发·驱动开发·qt·opencv·嵌入式linux
waicsdn_haha19 分钟前
Java/JDK下载、安装及环境配置超详细教程【Windows10、macOS和Linux图文详解】
java·运维·服务器·开发语言·windows·后端·jdk
_WndProc21 分钟前
C++ 日志输出
开发语言·c++·算法
薄荷故人_22 分钟前
从零开始的C++之旅——红黑树及其实现
数据结构·c++
m0_7482400222 分钟前
Chromium 中chrome.webRequest扩展接口定义c++
网络·c++·chrome
qq_4335545430 分钟前
C++ 面向对象编程:+号运算符重载,左移运算符重载
开发语言·c++