程序设计:控制台输出二叉树 二叉树的形象显示

news2025/1/12 13:42:08

       本文指导你编写一个输出到字符控制台的形象的二叉树展示。

目录

一般的Tree显示方式

理想的显示方式

实现方法

计算显示位置

输出数据

计算显示位置的代码

输出数据的代码


一般的Tree显示方式

        编写二叉树算法时调试是很头疼的,如何显示成一目了然的树结构呢?以目录树方式显示当然比较简单,类似windows控制台的Tree命令的效果:

        这种输出只需要正确计算节点的缩进级别就可以了,用一个递归函数很容易就实现了。

        但是这种输出方式并不方便查看,不容易直接看到两个子节点。而我们一般讲解二叉树的时候都是横向排版,两个子节点排在父节点下面的同一行。

理想的显示方式

        理想的显示方式如下图所示:

        这就是程序的实际输出效果,左子节点左边有个“[”,右子节点右边有个“]”,这样每一组子节点就一目了然,左子树整个都显示在父节点的左边,右子树整个都显示在父节点右边。

        由于我们的目的不是做完美的界面,所以不会考虑ncurse库这种能随意绘制的方式(如果这样不如直接用图形界面了),我们只考虑一般的逐行输出的控制台。

实现方法

        要想实现这种效果,需要分两步来做:

  1. 计算整个左子树的宽度,从而确定节点显示位置
  2. 根据计算好的显示位置自上而下输出数据

计算显示位置

        计算显示位置是个比较复杂的事情,因为每个节点的显示宽度是不确定的,需要预先确定每个节点的宽度,然后根据结构计算正确的位置,如果子节点缺失,没必要占用显示空间。

        既然这么复杂,我们可以把问题拆开,把计算精确位置留给第二步,把每个节点当成一个格子,这一步只计算格子位置。

        计算出的格子位置如何保存呢?这就需要一个表格,这个表格的行列数刚好容纳整个二叉树。仔细观察一下上面的输出示例图形,每一个节点都独立占据一列,因为表格的列数就是总的节点数,行数就是树的深度。

        这样很容易预先申请一个二维数组,然后根据计算出的位置设置里面的值,最后将这个二维数组输出就可以了。

输出数据

        经过上一步,输出数据已经在二维数组里,如何显示就比较容易了。只需要预先计算一下每列的最大显示宽度,然后逐个输出就可以了。

        当然为了实现这个功能,最好有一些包装类,以简化操作。

计算显示位置的代码

        这只是示意代码:

	//树形显示,px为偏移量,左边元素数
	void _check_show_tree(Table& table, T_SIZE h, bool left = true, T_SIZE line = 0, T_SIZE px = 0)
	{
		//thelog << h << " " << line << " " << px << endi;
		if (!_check_is_data_node(h))
		{
			//thelog << "空" << endi;
			return;
		}

		T_SIZE leftCount = _check_get_count(TREE_NODE::at(h).hLeft);
		//thelog << "leftCount " << leftCount << endi;
		T_SHM_SIZE pos = px + leftCount;
		table.SetData(line, pos, TREE_NODE::at(h).toString2(left));//设置自身数据
		//thelog << "TREE_NODE::at(h).hLeft " << TREE_NODE::at(h).hLeft << endi;
		_check_show_tree(table, TREE_NODE::at(h).hLeft, true, line + 1, px);//处理左子项
		//thelog << "TREE_NODE::at(h).hRight " << TREE_NODE::at(h).hRight << endi;
		_check_show_tree(table, TREE_NODE::at(h).hRight, false, line + 1, pos + 1);//处理右子项
	}

        解释一下这个代码:

        Table是个包装好的类,能通过table.SetData()直接对某个位置设置值。

        T_SIZE h 就是节点的指针或者句柄,这里实际上是位置索引。

        _check_is_data_node(h) 判断一个位置是否是有效位置,相当于判断是不是空指针。

        TREE_NODE::at(h) 获取位置上的节点对象的引用。

        TREE_NODE::at(h).toString2(left) 这个代码获得节点的显示字符串,参数控制是否是左节点,左节点添加“[”,右节点添加“]”。

        基本逻辑就是:

        如果不是有效节点,返回0

        否则返回1+左节点树的总节点数+右节点数的总节点数

输出数据的代码

        第一步,计算每个列的最大宽度

        第二步,按照每个列的最大宽度输出每个字段,为了格式整齐,一定要用空格来填补,不可以用tab。数据中最好不要有tab、回车换行之类的东西,也不要有中文。

(这里是结束)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1184073.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C/C++轻量级并发TCP服务器框架Zinx-游戏服务器开发003:架构搭建-需求分析及TCP通信方式的实现

文章目录 1 项目总体架构2 项目需求2.1 服务器职责2.2 消息的格式和定义 3 基于Tcp连接的通信方式3.1 通道层实现GameChannel类3.1.1 TcpChannel类3.1.2 Tcp工厂类3.1.3 创建主函数&#xff0c;添加Tcp的监听套接字3.1.4 代码测试 3.2 协议层与消息类3.2.1 消息的定义3.2.2 消息…

算法训练 第六周

一、用栈实现队列 本题要求我们使用栈这个数据结构来模拟实现队列的各种操作&#xff0c;我们的具体思路是使用两个栈&#xff0c;将一个栈当作输入栈&#xff0c;用于压入 push传入的数据&#xff1b;另一个栈当作输出栈&#xff0c;用于 pop和 peek 操作。每次 pop 或 peek 时…

CHOME、EDGE无法打开网页问题处理方法

最近有多位同时反馈CHOME/EDGE无法打开网页&#xff0c;如下提示 右键点CHOME/EDGE图标&#xff0c;在属性-兼容性&#xff0c;勾上以兼容模式运行这个程序&#xff0c;确定即可。

【Verilog 教程】7.4Verilog CIC 滤波器设计

积分梳状滤波器&#xff08;CIC&#xff0c;Cascaded Integrator Comb&#xff09;&#xff0c;一般用于数字下变频&#xff08;DDC&#xff09;和数字上变频&#xff08;DUC&#xff09;系统。CIC 滤波器结构简单&#xff0c;没有乘法器&#xff0c;只有加法器、积分器和寄存器…

方法----JAVA

方法 使用方法提高了代码的复用性 方法的定义和调用 方法概述:JAVA 方法的调用,不调用不执行,就只会在硬盘上待着 带参方法 无参方法 无参方法 调用格式: 方法名(); 方法格式: //最简单的方法格式 public static void 方法名(){ //方法体 } 带参方法 调用格式: 方…

C语言之extern关键字实例总结(八十二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

HBase表数据的读、写操作与综合操作

文章目录 HBase表数据的读、写操作与综合操作一、实验目标二、实验要求及注意事项三、实验内容及步骤 附&#xff1a;系列文章 HBase表数据的读、写操作与综合操作 一、实验目标 熟练掌握通过HBase shell命令来设计HBase表结构实例掌握使用HBase编程创建HBase表、删除HBase表…

中国发表第一篇计算机顶会的人都怎么样了?中国ACL、AAAI、CVPR第一人是谁

夕小瑶科技说 整理 | 王二狗中国大陆发第一篇计算机顶会的人都怎么样了&#xff1f;相信AI从业者对这个话题都会非常感兴趣&#xff0c;本文对知乎上各位大佬的信息做一个整理&#xff0c;分享给大家。 注&#xff1a;信息由知乎网友整理&#xff0c;不保证100%准确&#xff0c…

主流新闻媒体有哪些,怎么邀约记者

主流新闻媒体是社会信息传播的重要渠道&#xff0c;它们拥有广泛的受众群体和影响力。邀请主流新闻媒体参与活动或报道&#xff0c;可以迅速扩大活动影响力&#xff0c;提升组织的知名度和公信力。下面介绍一些主流新闻媒体及邀约媒体的方法。 主流新闻媒体 1、电视台&#x…

算法通过村第十八关-回溯|白银笔记|经典问题

文章目录 前言组合总和问题分割回文串子集问题排序问题字母大小写全排列单词搜索总结 前言 提示&#xff1a;我不愿再给你写信了。因为我终于感到&#xff0c;我们的全部通信知识一个大大的幻影&#xff0c;我们每个人知识再给自己写信。 --安德烈纪德 回溯主要解决一些暴力枚举…

Find My拐杖|苹果Find My技术与拐杖结合,智能防丢,全球定位

拐杖是一种重要的医疗康复辅助用具&#xff0c;辅助腿脚不灵活的人群平稳的行走&#xff0c;避免出现摔倒等情况。目前&#xff0c;全球均已步入老龄化社会&#xff0c;那么老年人的生活质量和安全成为各国学者的关注点。由于年龄原因容易突发意外情况&#xff0c;如摔倒&#…

SSM大学生众筹平台-计算机毕设 附源码22506

SSM大学生众筹平台 摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 大学生众筹平台&#xff0c;主要的模块包括管理员和用户及筹资用户&#xff0c;实现功能包括&#xff1a;首页、个人资料&a…

多媒体融合应急通信解决方案

近年来&#xff0c;随着经济社会快速发展和现代化进程加快&#xff0c;我国公共安全面临诸多新的挑战。面对大型安全事故发生后&#xff0c;救援队伍必须在恶劣的条件下迅速建立指挥调度中心&#xff0c;方能协调前后方救援力量&#xff0c;这对应急通信网络建设的可靠性、时效…

基于springboot实现智慧外贸平台系统【项目源码+论文说明】

基于springboot实现智慧外贸平台管理系统演示 摘要 网络的广泛应用给生活带来了十分的便利。所以把智慧外贸管理与现在网络相结合&#xff0c;利用java技术建设智慧外贸平台&#xff0c;实现智慧外贸的信息化。则对于进一步提高智慧外贸管理发展&#xff0c;丰富智慧外贸管理经…

ICC2与PT端口时序上的差别

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 有星球成员遇到如下问题: 你好,我想问一下就是之前一直遇到一个情况:INtoReg的path_group的时序报告,ICC2里launch的clock network delay(propagated)会有一个值,skew就很小。 但是到PT里launc…

窗函数法设计FIR中,如何选择窗函数和滤波器阶数N

窗函数法设计FIR中&#xff0c;如何选择窗函数和滤波器阶数N 1、概述 在用窗函数法设计FIR滤波器时&#xff0c;给出了滤波器要求的具体指标&#xff0c;包括通带频率fp、阻带频率fs、通带波纹Rp 和阻带衰减As 等&#xff0c;有了这些指标后&#xff0c;是否什么窗函数都可以选…

辐射骚扰整改思路及方法:实地验证?|深圳比创达电子EMC

某产品首次EMC测试时&#xff0c;辐射、静电、浪涌均失败。本篇文章就“实地验证”问题进行详细讨论。 方案拟定好后&#xff0c;就该准备前往EMC检测机构进行测试了。出发前&#xff0c;先分析4个解决方案的易操作程度&#xff1a;方案2最容易验证&#xff0c;只要将磁环往电…

【机器学习】六、概率图模型

今天我们对概率图模型&#xff08;Probabilistic Graphical Model&#xff0c;PGM&#xff09;做一个总结。 模型表示 概率图模型&#xff0c;是指一种用图结构来描述多元随机变量之间条件独立关系的概率模型。 它提出的背景是为了更好研究复杂联合概率分布的数据特征&#x…

亚马逊合规,亚马逊涉及12个站点合规政策更新,需警惕合规要求!

最近&#xff0c;许多亚马逊站点的卖家陆续收到了合规政策更新的通知邮件&#xff0c;涵盖了美国站、加拿大站、英国站、法国站、意大利站、德国站以及西班牙站。 这些更新影响了不同品类的卖家&#xff0c;包括以下品类&#xff1a; 美国站&#xff08;US&#xff09;对于“发…

农林牧数据可视化监控平台 | 智慧农垦

数字农业是一种现代农业方式&#xff0c;它将信息作为农业生产的重要元素&#xff0c;并利用现代信息技术进行农业生产过程的实时可视化、数字化设计和信息化管理。能将信息技术与农业生产的各个环节有机融合&#xff0c;对于改造传统农业和改变农业生产方式具有重要意义。 图扑…