我想以树形格式打印我的BST内容,如:
我当前的打印输出:
10 - > 20 - > 30 - > 40 - > 60 - > 80 - > 90 - >
我希望它是什么样的:
40
/\
/ \
20 60
/ \ \
10 30 80
\
90
我尝试过做一些gotoxy但是由于某些原因我不能让它像树一样打印,我想我需要做的不仅仅是gotoxy。此外,“\”并非真正必要,只是一个不会混淆任何人的附加功能。
守则如下:
结构:
struct btnode
{
int value;
struct btnode *l;
struct btnode *r;
}*root = NULL, *temp = NULL, *t2, *t1;
打印:
void inorder(struct btnode *t)
{
if (root == NULL)
{
printf("No elements in a tree to display");
return;
}
if (t->l != NULL)
inorder(t->l);
printf("%d -> ", t->value);
if (t->r != NULL)
inorder(t->r);
}
我在树木打印方面的尝试:
void print(struct btnode *t, int x, int i, int y)
{
i = i / 2 + 2;
if (root == NULL)
{
printf("No elements in a tree to display");
return;
}
if (t->l != NULL){
print(t->l, (x + i), i, (y + 1));
}
if (t->r != NULL){
print(t->r, (x + i), i, (y + 1));
}
gotoxy(x, y * 2);
printf("%d -> ", t->value);
}
关于如何基于我当前的输出代码实现树输出的任何想法,虽然我假设我需要做更多的if和else将其变成树。任何事情都会有所帮助,指南或想法真的会受到赞赏。
谢谢
答案 0 :(得分:1)
棘手的问题。让我们首先看一个更简单的问题:如何水平打印树,左边是根,右边是树枝。这可以通过跟踪缩进级别来在控制台窗口中没有光标定位的情况下完成:
void horizontal(struct btnode *t, int level)
{
int l = level;
if (t == NULL) return;
horizontal(t->l, level + 1);
while (l--) printf(" ");
printf("-> %d\n", t->value);
horizontal(t->r, level + 1);
}
从上到下打印树是类似的。缩进现在是从顶部开始的位置。棘手的部分是如何将印刷推向正确的位置。在简单的控制台示例中,这是通过打印新行来完成的。在这里,我们必须提升x
的位置。这可以使用全局变量x
来完成,但您也可以将状态保存在print函数中指向的变量中:
void print(struct btnode *nd, int *x, int y)
{
if (nd == NULL) return;
print(nd->l, x, y + 4);
gotoxy(*x, y);
printf("%d", nd->value);
*x += 4;
print(nd->r, x, y + 4);
}
像这样调用print
函数:
int x = 0;
print(root, &x, 0);