需要树形打印代码的帮助

时间:2011-09-08 18:53:19

标签: c

我正在尝试打印这棵树:

    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

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

感谢。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

在每一代树之后,您没有任何代码可以打印换行符('\ 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()期间填充此值以防止算法变得太慢。