【问题标题】:printing a BST in a tree format in turbo c在 turbo c 中以树格式打印 BST
【发布时间】:2014-02-24 05:59:57
【问题描述】:

我想以树格式打印我的 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 来将它变成一棵树。任何有帮助的东西,指南或想法都会非常感激。

谢谢

【问题讨论】:

  • 尝试先水平打印树,这样更容易。将缩进级别的信息传递给print 函数,当然,打印缩进并以换行符结束打印格式。此外,打印应该发生在递归调用之间,而不是在它们之后。
  • 如果将 35、41 和 50 添加到数据集中,您期望答案是什么样的。
  • @MOehm,这有什么帮助?假设你在“30”节点上,它不应该打印换行符,因为“60”还没有被处理。
  • @DwayneTowell:是的,没错。我现在编辑了评论,建议在尝试上面相当困难的格式之前先线性打印树并翻转。抱歉,我没有注意到 tres 被诅咒了,所以我错过了重点。
  • @MOehm 你介意为那个提供解决方案吗,所以我首先要做的是水平打印树并将该值传递给打印函数以转换为树?跨度>

标签: c data-structures tree binary-search-tree


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

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

【讨论】:

  • nd 是您在代码中所称的 t - 应该使用您的命名法,抱歉。 ndt 在第一次调用中的值当然是 root。 (我在我的print 中根本不使用root 并在函数内部检查NULL。根据您的逻辑,您将始终必须对调用进行检查。这在某种程度上更好,因为你节省了不必要的调用,但它也有潜在的危险,因为客户端代码必须进行检查。)
  • 我明白了,再次感谢 :)。无论如何我可以检查树的高度是否达到某个值?
  • 当然 - 当前高度是 y。当它超过一定值时,您可以提前返回以修剪您的树。
  • 函数的定义在哪里 --> gotoxy(*x, y);
  • @YogeeshHT:我相信gotoxy(x, y) 是Turbo C 的<conio.h> 套件的一部分。 OP 在示例代码中也使用了它。更便携的ncurses 库有move
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多