控制台图形化打印二叉树(c/c++)

article/2025/10/23 4:51:02

二叉树作为一种常见的数据结构,我们在学习的过程中会经常用到.

当我们做课设的时候,能把二叉树图形化的打印出来无疑是一个加分项,所以今天我们就来探讨一下如何图形化的打印出二叉树来.

目录

分析阶段

如何打印

如何将数据存入打印数组

代码实现

存储结构定义

二叉树的创建

求深度

打印功能的代码实现

测试运行


分析阶段

如何打印

我们要完成二叉树的打印,至少要保证所有的节点都能打印在屏幕上而不冲突,而一个二叉树节点最多的情况就是满二叉树.所以我们只需要想好满二叉树如何打印出来便可.

打印二叉树需要以二叉树的遍历为基础,我们要打印出每一个节点就需要对每一个节点进行遍历,在遍历二叉树时递归的先序(中序,后序)更为简单.而控制台打印时只能一行一行的打印,所以我们可以将要打印出来的图形先存储到一个数组中.

存在数组就必定要有大小,数组的大小取决于我们二叉树的高度.

只有一个根节点的二叉树只需要一个1×1的数组就可以存储开

1

当有一个根节点及其左右孩子时,我们便需要5×3的数组来存储(为了美观起见,加上了斜杠和反斜杠)

1
/\
11

让我们在加一层,当二叉树达到三层时,需要13×7的数组来存放

1
/\
/\
/\
11
/\/\
1111

通过总结规律我们发现,要能打印出完整的二叉树,宽度要依据最后一行的叶子节点的个数而来.而为了让它显的匀称我们让每个叶子节点之间相隔三个宽度,经计算存储一颗二叉树需要的数组宽度是

宽度=(2^(n-1)-1)*3+2^(n-1) n为层数

化简可得

宽度=2^(n+1)-3 n为层数

接下来计算高度,二叉树的每一层节点只需要一个高度,但层与层之间的连线高度确是不一样的.从上往下看时,当总层数只有两层时,第一层与第二层之间连线占一格高,当层数为三层时,第一层与第二层之间的连线占三格高.所以从上往下看,很难找到连线所占高度的规律.

这时不妨从下往上找,可以发现,倒数第一层与倒数第二层之间的连线高度必为1,倒数第二层与倒数第三层之间的高度必为3.倒数第三层与倒数第四层之间的连线高度必为7.到这里我们可以总结出一条规律,层与层之间的连线,必是2的n次方减一.

最后我们得出,对这个数组需要申请的内存大小是

宽度=2^(n+1)-3
高度=2^n-1
n为层数

如何将数据存入打印数组

在生成打印数组时我们可以先将根节点放入整个数组第0行的最中间位置,然后查看有无左右孩子,若有则将左右孩子当成新的根节点进行递归.

代码实现

存储结构定义

我们用二叉链表来作为二叉树的存储结构

typedef struct TreeNode{char data; //数据域struct TreeNode * lchild,* rchild; //左右孩子指针
}TreeNode,*P_Node;

二叉树的创建

我们将通过从控制台读取字符串的形式来创建二叉树

规则如下:

将二叉树写成先序遍历串,以 根-左孩子-右孩子 的形式组成

每个节点为单个字符

若该节点处无孩子则写成'.'

 上图的二叉树就可以写成:ABC..DE.G..F...

//创建树,将输入的字符串以先序的形式存入二叉树
void CreateTree(P_Node &T)
{char ch;scanf("%c",&ch);if(ch == '\n'){return;}if(ch == '.'){T = NULL;return;}T = (P_Node)malloc(sizeof(TreeNode));T->data = ch;CreateTree(T->lchild);CreateTree(T->rchild);
}

求深度

在生成打印数组时我们就需要用到二叉树的深度,也就是层数,所以我们也需要实现求深度的功能(递归实现)

//求深度
int DeepTree(P_Node T)
{if(!T){return 0;}return DeepTree(T->lchild)>DeepTree(T->rchild)?DeepTree(T->lchild)+1:DeepTree(T->rchild)+1;
//关键代码:如果该节点的左子树深度大于右子树则将左子树的深度加一返回,这个返回值便是以该节点做根节点的树的深度,右子树深度大时则相反
}

打印功能的代码实现

做好了前置工作,本文的重点来了.

首先设置全局变量width和height,这两个值在两个函数中都会用到,所以设置成全局的.

int width,height;

同时我们规定,数组类型为char,用一串连续的空间代替二维数组,数组中存的值与打印出来的效果对应如下表. 

-1打印'/'
1打印'\'
0打印空格
其他直接打印字符

要实现打印功能我们需要将需要用到递归的部分独立出来作为一个递归函数.此函数功能为先序遍历二叉树,同时向打印数组填入内容.

//T为二叉树的根节点,a是数组的起始地址,i,j是当前节点在数组中的位置
//如果节点有孩子,其孩子的j坐标为 j±(height-i+1)/2
void fillArray(P_Node &T,char *a,int i, int j)
{int ti,tj;if(T) //如果该位置有节点{*(a+(i*width)+j) = T->data; //向数组该点填入字符if(T->lchild) //有左右孩子给对应的连接线,左右孩子的值在下一层递归赋{//将该点与其左孩子之间的连线全部填上'/'for(ti=i+1,tj=j-1;tj>j-(height-i+1)/2;tj--){*(a+((ti)*width)+tj) = -1;ti++;}}if(T->rchild){for(ti=i+1,tj=j+1;tj<j+(height-i+1)/2;tj++){*(a+((ti)*width)+tj) = 1;ti++;}}//经过循环,ti恰好指到其孩子所在的层fillArray(T->lchild, a, ti, j-(height-i+1)/2);fillArray(T->rchild, a, ti, j+(height-i+1)/2);}
}

计算宽高及实现打印功能的函数

void printBiTree(P_Node &T)
{int i,j;int n = DeepTree(T); //计算出深度n//在计算机中数据以二进制形式存储,所以一个数据左移1位就相当于乘以2的1次方width = (2<<n)-3;  // 2^(n+1)-3height = (2<<(n-1))-1; // 2^n-1char *a = (char *)malloc(sizeof(char) * (width*height)); // 申请空间// 空间初始化为0for(i=0;i<height;i++){for(j=0;j<width;j++){*(a+(i*width)+j) = 0;}}//调用之前定义好的函数,填充打印数组fillArray(T, a, 0, (width-1)/2);//根据打印数组的内容来实现打印for(i=0;i<height;i++){for(j=0;j<width;j++){if(*(a+(i*width)+j) == -1){printf("/");}else if(*(a+(i*width)+j) == 1){printf("\\");}else if(*(a+(i*width)+j) == 0){printf(" ");}else{printf("%c", *(a+(i*width)+j));}}printf("\n");}
}

测试运行

用例1: AB..B..

用例2: ABC..C..BC..C..

 

用例3: ABCD..D..CD..D..BCD..D..CD..D..

 

用例4: 

 


http://chatgpt.dhexx.cn/article/k9wVKikF.shtml

相关文章

C语言:围圈报数游戏

游戏规则&#xff1a;有N个人围成一圈&#xff0c;顺序排号&#xff0c;从第一个人开始1到D报数&#xff0c;&#xff0c;凡报到D的人退出圈子&#xff08;下场&#xff09;&#xff0c;问最后留下来的是原来的第几号&#xff1f; 逻辑思想&#xff1a;用布尔数组记下每个人的…

c语言 打印共九行的菱形,用C语言打印图案的几种实现方法

循环的使用 维普资讯 http://doc.xuehai.net 科技伯. 1 1 0计算机与信息技术 0 S IN E I F R TO CE C N O MA I N 20 06年第 4期 用 C语言打印图案的几种实现方法 陈莹张青锋 (口师范学院计科系河南周口周 46 0 ) 60 0 摘要&#xff1a;经过几年来在 c语言教学中的实践&#xf…

C语言实现打印简易圣诞树

C语言实现打印简易圣诞树 引言想法的诞生一棵简易的圣诞树怎么构成梯形的代码梯形的叠加做一个长方形树干 总代码及其输出的简易圣诞树 引言 各位大佬好&#xff0c;我是一名大一的学生&#xff0c;目前只学习了C语言的语法基础&#xff0c;在CSDN这个平台上将自己所学的东西记…

HTML圈c怎么打出来,一种方便固定手表的展示C圈的制作方法

本实用新型属于展示C圈技术领域&#xff0c;具体涉及一种方便固定手表的展示C圈。 背景技术&#xff1a; 展示C圈是用来展示手表的必备器材&#xff0c;展示C圈采用耐用透明展示底座&#xff0c;方便工作人员为顾客展示手表的折光度。 原有展示C圈&#xff0c;手表固定在C圈上时…

c语言圈复杂度switch,干货|C语言switch\/case圈复杂度优化重构

点击上方“中兴开发者社区”&#xff0c;关注我们 每天读一篇一线开发者原创好文 ▍作者简介 作者陈彬是一名Linux驱动开发工程师&#xff0c;对Linux内核、软件设计和敏捷有较浓厚的兴趣和长期实践经验。自从项目建立起代码质量规范和监控工具后&#xff0c;如何重构高圈复杂度…

c语言圈复杂度switch,C语言switch/case圈复杂度优化重构

软件重构是改善代码可读性、可扩展性、可维护性等目的的常见技术手段。圈复杂度作为一项软件质量度量指标,能从一定程度上反映这些内部质量需求(当然并不是全部),所以圈复杂度往往被很多项目采用作为软件质量的度量指标之一。 C语言开发的项目中,switch/case代码块是一个很容…

Excel2016打开文件后显示空白

打开文件时显示 打开后空白 解决办法:

Excel双击文件打开后是空白,再次双击才能打开

Excel双击打开文件只弹出空白页面&#xff0c;再双击才打开所需页面。 解决方案&#xff08;仅供参考&#xff09;&#xff1a;WINR -->regedit-->修改HKEY_CLASSES_ROOT\Excel.Sheet.12\shell\Open\command项->默认值 数值数据原值后面加上 “%1” 点击确定即可 如&…

【Windows】Excel2019打开文档显示空白且工具栏灰色无法点击

如标题&#xff0c;要想打开Excel文档&#xff0c;只能通过菜单栏操作&#xff1a;文件->打开&#xff0c;然后选择要打开的文档才能正常显示。遇到这个问题很久了&#xff0c;今天着实忍不住了&#xff0c;特记录一下解决方法。 1、查看是否隐藏 点击“视图”菜单&#x…

Excel 2016打开后显示灰色空白页解决方法

重新装了系统&#xff0c;安装上Excel2016&#xff0c;发现打开xls文件只显示一个灰色的开始页面 再次打开excel文件才显示内容&#xff0c;一直这样岂不是太繁琐&#xff1f; 找到了一个教程&#xff0c;在Excel启动选项设置一下。文件-选项-常规-启动选项&#xff0c;将应用…

解决Excel打开后灰色没有内容的问题

问题现象 双击打开的Excel文件&#xff0c;扩展名包括xls、xlsx、csv&#xff0c;如下图&#xff1a; 解决方案 1、打开注册表 快捷键Win R&#xff0c;输入regedit&#xff1a; 2、修改注册表 计算机\HKEY_CLASSES_ROOT\Excel.csv\shell\Open\command计算机\HKEY_CLA…

excel打开空白不显示内容

打开excel文档不显示文件内容&#xff0c;一片灰色 找到此文件&#xff1a;HKEY_CLASSES_ROOT\Excel.Sheet.12\shell\Open\command 修改 “默认” 值 修改前&#xff1a;“C:\Program Files\Microsoft Office\Root\Office16\EXCEL.EXE” /dde 修改后&#xff1a;“C:\Program F…

excel2007打开灰色空白

选项-高级 把dde项勾选掉即可&#xff0c;重启excel 转载于:https://www.cnblogs.com/gsl371-blog/p/7006957.html

excel白屏未响应_「excel打开空白」Excel 2016 打开后空白的解决方法 - seo实验室

excel打开空白 最近使用excel 2016时遇到一个这样的状况,就是双击打开一个有内容的xlsx表格后显示空白,用管理员身份打开也是一样,这里总结一下解决方法: 说明:Office 2016在安装时会默认安装在系统盘,都不给修改安装位置的机会,我的安装位置是做了修改的(修改Office 20…

Excel - 插入空白行

简单的插入一个空白行&#xff0c;只需选中一行&#xff0c;右键&#xff0c;选择插入一行即可。 如果要一次插入多个空行&#xff0c;可以按住Ctrl键&#xff0c;然后逐个选中想要插入的行&#xff0c;然后执行插入操作&#xff0c;如下所示&#xff1a; 选中张三、王五、田七…

html文件桌面图标空白,excel桌面图标空白但是能打开

本文的教程为大家分享了两种excel文件不显示图标的情况&#xff0c;以及他们对应的不显示图标的解决方法和设置. Excel文件不显示图标的第一种方式&#xff1a;图标未知 如下面的截图&#xff0c;一个Excel文档&#xff0c;在桌面上预览&#xff0c;可以看到excel文件不显示图标…

如何解决每次打开Excel2016文件都是灰色空白页,要把文件拖进去才能显示

1、打开注册表&#xff1a;开始->运行&#xff0c;输入“regedit”后&#xff0c;回车。 2、"HKEY_CLASSES_ROOT"。 3、展开root后进入找到如图所示的 sheet8->open-command;找到默认值。 4、鼠标 右键 默认值 选择更改 会出现如图所示的对话框。 5、修改这个值…

解决Excel打开后空白的问题 (页面为灰色)——实战分享

今天听到一同事说电脑意外断电后&#xff0c;重启电脑返回桌面后打开所有的Excel文档都变成空白的了&#xff0c;如下图&#xff1a; 只能通过“打开”命令来打开Excel文档。但可以正常打开word文档。。。后来经过网上搜索问题目答案&#xff0c;终于很快搜到了方法解决了以上的…

Excel 2016 打开后空白的解决方法

最近使用Excel 2016时遇到一个这样的状况&#xff0c;就是双击打开一个有内容的xlsx表格后显示空白&#xff0c;用管理员身份打开也是一样&#xff0c;这里总结一下解决方法&#xff1a; 说明&#xff1a;Office 2016在安装时会默认安装在系统盘&#xff0c;都不给修改安装位置…

解决Office Excel文档打开显示空白

打开文档如图情况 第一步检查视图是否开启隐藏&#xff0c;如图无&#xff0c;按下图操作 点击菜单》》Excel选项》》 点击高级&#xff0c;拉下页面&#xff0c;把忽略使用动态数据交换&#xff08;DDE&#xff09;的其他应用程序勾选去掉》点确定即可