二叉树的图形化展示(到终端/文件)【C】

本文介绍如何在C语言中将二叉树图形化地显示到终端或文件。作者通过创建内外两个队列,按层次遍历二叉树,存储和打印节点数据。在终端中,通过调整打印字符实现美化。代码实现包括递归遍历二叉树、存储节点数据、以及在终端和文件中输出图形化的二叉树。
先亮结果

输出到终端效果:输出到终端效果图
输出到文件效果:
输出到文件效果

写在前面
怎么会想到把二叉树图形化

好玩……是一方面,另一方面是:学写二叉树的时候需要检查自己建立的二叉树结构对不对,在C语言里面的做法会是把当前树节点及左右子树节点地址及对应数据打印出来,然后通过节点联系对应来检查,我暑假写的时候就是这么干的。
不过,我当时想到了Java,Java只有引用,那到时候要怎么处理会更好些?
于是,我就有了图形化打印的想法。


##### 思路
(以下方法能实现,但不是 队列 的正确使用姿势,不建议采用了)
另外,可以参考这里


涉及的数据结构
  • 不论是将二叉树打印到终端还是文件,图形化输出都是按层进行的。
    (我尝试过按递归遍历的顺序打印,但都没有处理好)
  • 于是,涉及的数据结构有:二叉树(本身)、队列(两个)
    • 二叉树,本身就是要将二叉树的数据打印输出
    • 队列1(内队列)Queue,用来存储每一层的数据,一层占用一个内队列
    • 队列2(外队列)QueueQueue, 用来存储每一层对应队列的头节点地址等信息,一个内队列的信息占用一个外队列节点,一棵二叉树用一个外队列
      (如果能按遍历顺序打印,那可以不用队列结构;如果有更好的思路,可以只用一个队列,用两个队列是我目前想到的方法)
实现思路
  • 创建一个外队列
  • 递归遍历二叉树,每进入一层
    • 如果是第一次进入,那么先给外队列增加一个节点
    • 在外队列中找到当前层对应的内队列,将当前树节点数据添加到内队列中
  • 遍历结束,二叉树所有数据都已被获得。依次弹出外队列的节点,每个节点对应着一个内队列,所以再将内队列节点依次弹出,弹出的同时打印数据
  • 在打印数据前后加入一定数量的短横线和竖线进行美化
开始C代码实现
前提

这是我写的简单队列的接口,作为内队列。外队列与此类似
(C原生不支持泛型和面向对象,所以外队列要重新定义。)

#ifndef _QUEUE_H_
#define _QUEUE_H_
#include <stdbool.h>
#include "binaryTree.h"  //二叉树的头文件,里面有Item数据类型的定义

//定义结构体类型
typedef struct _node
{
   
   
    struct _item item;
    struct _node *pnext;
} Node;

typedef struct _queue
{
   
   
    struct _node *phead;
    struct _node *ptail;
    int total;
} Queue;


//声明队列具有的操作
Item* NewData(const char* name, int number);  //创建空数据
Queue* NewQueue();  //创建空队列节点

void InitializeQueue(Queue *queue);  //初始化队列

bool IsEmpty(const Queue *queue);  //检查队列是否为空
int GetLength(const Queue *queue);  //得到队列长度

void Append(Queue *queue, Item item);  //队列增加值,只能在末尾追加
Item Remove(Queue *queue);  //队列删除值,只能在头部删除

void Traverse(Queue *queue, void (*fun)(Node *node));  //遍历节点并执行回调函数

#endif
下面是程序主体

定义函数showTree雏形

void showTree(const Tree *tree)
{
   
   
	//声明普通变量,如:int floor,需要一个变量在递归时指示当前层数,然后来定位对应的内队列
	//声明外队列
	//递归遍历取得所有数据
	//将数据处理输出
}

递归遍历二叉树,获得所有数据

//递归遍历二叉树,tree为 以当前节点为根节点 的子树,floor记录当前所在层数,queueQueue为外队列
static void traverseTree(const Tree *tree, int *floor, QueueQueue *queueQueue)
{
   
   
	//空树打印提示到错误流
    if (TreeIsEmpty
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值