【问题标题】:Need help with tree-printing code需要有关树形打印代码的帮助
【发布时间】:2011-09-08 18:53:18
【问题描述】:

我正在尝试打印这棵树:

    1 
   / \
  2   3
 /   / \
4   5   6

这样:

1
2 3
4 5 6

我写了这段代码:

void print_g(Tree t)
{
    Queue q=initQueue();
    Tree tmp=initTree();
    if(!isTreeEmpty(t))
        enqueue(q,t);
    while(!isQueueEmpty(q))
    {
        tmp=dequeue(q);
        printf("%d ",*((int *)Root(tmp)));
        if(!isTreeEmpty(subLeft(tmp)))
            enqueue(q,subLeft(tmp));
        if(!isTreeEmpty(subRight(tmp)))
            enqueue(q,subRight(tmp));

    }
}

但是这段代码是这样打印的:

123456

我想不出如何解决打印问题。 有人可以写伪代码吗??

谢谢。

【问题讨论】:

  • 您的代码在任何地方都没有“\n”,您希望它如何显示?您必须在每个级别加入一个分隔符。
  • 这不是一个重复的问题,这个问题是关于如何向 BFS 添加新行,而不是如何更好地实现 BFS。
  • 出于帮助查找的目的,这种遍历有时被称为“迭代深化”

标签: c


【解决方案1】:

将子节点添加到队列后,创建一个值为换行符的假树节点并将其添加到队列中。

【讨论】:

  • 没关系,我以为您的意思是在将孩子添加到队列后打印换行符。加入它应该可以工作,尽管 OP 必须使用一些条件来修复 printf 格式。
【解决方案2】:

您没有任何代码可以在树的每一代之后打印一个换行符 ('\n')。

您需要找到某种方法来告诉您的程序何时通过树生成,然后将 '\n' 粘贴在那里。

也许:

void print_g(Tree t)
{
    Queue q=initQueue();
    Tree tmp=initTree();
    if(!isTreeEmpty(t))
        enqueue(q,t);

    int dist = distanceFromTop(t); // new function to tell us which generation we are in

    while(!isQueueEmpty(q))
    {
        tmp=dequeue(q);

        if (distanceFromTop(tmp) != dist) // have we changed generation from previous iteration?
            printf("\n"); // if so, newline
        dist = distanceFromTop(tmp);

        printf("%d ",*((int *)Root(tmp)));
        if(!isTreeEmpty(subLeft(tmp)))
            enqueue(q,subLeft(tmp));
        if(!isTreeEmpty(subRight(tmp)))
            enqueue(q,subRight(tmp));

    }
}

只需确保您的 Tree 定义有一个成员来保存自己的 distanceFromTop 并在 initTree() 期间填写此值,以防止算法变得太慢。

【讨论】:

  • 你是如何实现 distanceFromTop() 方法的?我能想到的最好的情况是给算法增加 O(n) 时间,但是如果你计划为每个节点走到树的顶部一次,那么这将增加 O(n^2) 时间。
  • 在我的脑海中,我将其实现为对Tree tmp=initTree(); 期间存储的值的简单查找。任何时候将子节点添加到父节点时,都会给该子节点的父节点距离 +1,然后沿着树向下更新其自己的子节点(给定问题中的样本数据,可能不会是任何子节点)
猜你喜欢
  • 1970-01-01
  • 2012-03-10
  • 2011-06-27
  • 2016-11-24
  • 2011-09-11
  • 2021-09-05
  • 2021-05-31
  • 1970-01-01
  • 2015-05-28
相关资源
最近更新 更多