如何在控制台中输出一个可视化的二叉树

这几天写了一堆平衡树的题,调吐了,每次debug都要写个dfs访问一遍,还很难看出错误,于是决定写一个可视化的二叉树程序
大概想了想,只要先把值输出出来,再根据值的位置补上树枝就行了
调用方法:root表示树根,son数组是表示一个点的左右儿子,num是点的权值,在init函数中把这几个值改成想输出的即可(当然也可以复制到代码中直接使用)
例如下文中init函数提供了一个样例
效果如下
如何在控制台中输出一个可视化的二叉树

#include<bits/stdc++.h>
using namespace std;
int root,son[1010][2],num[1010],f[10][1<<10];
pair<bool,bool> fl[1010][1010];
int calcf(int s,int j,int i)
{
	if (!s) return j;
	f[j][i]=num[s];
	return max(calcf(son[s][0],j+1,i<<1),calcf(son[s][1],j+1,i<<1|1));
}
void init()
{
	for (int i=1;i<=11;i++) num[i]=i;
	root=4;son[4][0]=11;son[4][1]=5;son[11][1]=3;son[11][0]=1;son[2][0]=1;son[3][0]=6;son[3][1]=7;
}
int main()
{
	init();
	char buf[1010][1010];
	int d=calcf(root,0,0);
	for (int j=0;j<d;j++)
	{
		int w=(1<<(d-j+1));
		int now=0;
		for (int i=0;i<1<<j;i++)
		{
			if (f[j][i])
			{
				sprintf(buf[j<<1]+strlen(buf[j<<1]),"%*d%*c",w,f[j][i],w,' ');
				fl[j][now]={f[j+1][i<<1],f[j+1][i<<1|1]};
				now++;
			}
			else sprintf(buf[j<<1]+strlen(buf[j<<1]),"%*c%*c",w,' ',w,' ');
		}
	}
	for (int j=0;j<d;j++)
	{
		int n=strlen(buf[j<<1]),now=0;
		for (int i=0;i<n;i++)
		{
			if (isdigit(buf[j<<1][i]))
			{
				if (fl[j][now].first)
				{
					int k=i;
					while (!isdigit(buf[(j+1)<<1][k-1])) {buf[j<<1|1][k]='-';k--;}
					buf[j<<1|1][k]='/';
				}
				if (fl[j][now].second)
				{
					int k=i;
					while (!isdigit(buf[(j+1)<<1][k+1])) {buf[j<<1|1][k]='-';k++;}
					buf[j<<1|1][k]='\\';
				}
				if (fl[j][now].first||fl[j][now].second) buf[j<<1|1][i]='|';
				now++;
			}
			else buf[j<<1][i]=' ';
		}
		buf[j<<1|1][n]='\0';
	}
	for (int j=0;j<d;j++)
	{
		puts(buf[j<<1]);
		int n=strlen(buf[j<<1]);
		if (j!=d-1)
		{
			for (int i=0;i<n;i++) printf("%c",buf[j<<1|1][i]);
			printf("\n");
		}
	}
}
上一篇:用Lua扩展谷歌拼音输入法


下一篇:Java 多态学习总结