这几天写了一堆平衡树的题,调吐了,每次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");
}
}
}