在turbo c中以树格式打印BST

在turbo c中以树格式打印BST,c,data-structures,tree,binary-search-tree,C,Data Structures,Tree,Binary Search Tree,我想以树状格式打印BST的内容,如: 我当前的打印输出: 10->20->30->40->60->80->90-> 我希望它是什么样子: 40 /\ / \ 20 60 / \ \ 10 30 80 \ 90 我试着做一些gotoxy,但由于某些原因,我无法让它像树一样打印出来,我想我需要做的不仅仅是gotoxy。而且“\”并不是真正必要的,只是一

我想以树状格式打印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来将其转换为树。任何有帮助的东西,一个指导或一个想法都会非常感激


谢谢你这个棘手的问题。让我们首先看一个更简单的问题:如何水平打印树,使树根向左,树枝向右生长。通过跟踪缩进级别,无需在控制台窗口中定位光标即可完成此操作:

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
完成,但也可以将状态保存在打印函数中指向的变量中:

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);

尝试先水平打印树,这样更容易。将缩进级别的信息传递给
打印
功能,当然,打印缩进并以换行结束打印格式。此外,打印应该在递归调用之间进行,而不是在递归调用之后进行。如果将35、41和50添加到数据集中,您希望得到什么样的结果。@MOehm,这有什么帮助?假设您在“30”节点上,它不应该打印换行符,因为“60”尚未处理。@DwayneTowell:是的,对。我现在编辑了评论,建议线性打印树,并在尝试上面相当困难的格式之前先翻转。我没有注意到树被画成了诅咒,所以我没有抓住要点,对不起。@MOehm你介意为这个问题提供一个解决方案吗,因此,我首先要做的是水平打印树,并将该值传递给要转换为树的打印函数?
nd
是您在代码中所称的
t
,应该使用您的术语,抱歉。当然,在第一次调用中,
nd
t
的值是
root
。(我在我的
print
中根本不使用
root
并在函数中检查
NULL
。根据您的逻辑,您必须始终对调用进行检查。这在某种程度上更好,因为您可以节省不必要的调用,但也有潜在的危险,因为客户端代码必须进行检查。)我明白了,再次感谢:)。我是否需要检查树的高度是否达到某个值?当然-当前高度为
y
。当它超过某个值时,您可以提前返回以裁剪树。其中是函数-->gotoxy(*x,y)的定义@YogeeshHT:我相信gotoxy(x,y)是TurboC的
套件的一部分。OP在示例代码中也使用了这一点。更便携的
ncurses
库具有
move