我正试着做一个函数,按照我教授的要求,以垂直的方式打印一棵二维二叉搜索树.但是,我无法计算在打印树的每一行时所需的适当间距.这反过来又会让它看起来一团糟.
下面是打印当前层的函数的循环/片段:
for (int i = 0; i < nodesInLevel; i++)
{
current = dequeue(q);
if (current != NULL)
{
printf("%d", current->data);
enqueue(q, current->left);
enqueue(q, current->right);
}
else
{
printf(" ");
enqueue(q, NULL);
enqueue(q, NULL);
}
if (i < nodesInLevel - 1) {
printSpaces(4);
}
}
printf("\n");
很简单,我使用广度遍历来导航树并相应地打印每一行. 下一部分是混乱的地方. 我应该打印斜线来表示边缘. 这应该很容易.只需要打印一个新行,(如new函数中所示)然后根据子对象是否存在来打印斜线.
正在讨论的循环:
for (int i = 0; i < nodesInNextLevel; i++)
{
printSpaces(spaces - 2);
if (current == NULL)
{
printSpaces(2);
continue;
}
if (current->left == NULL && current->right == NULL)
{
continue;
}
else if (current->left != NULL && current->right == NULL)
{
printSpaces(2);
putchar('/');
}
else if (current->left == NULL && current->right != NULL)
{
printSpaces(3);
putchar('\\');
}else
{
printSpaces(2);
putchar('/');
printSpaces(2);
putchar('\\');
}
}
printf("\n");
这两个for循环都在具有以下变量的更大的for循环中执行:
for (int level = 1; level <= treeHeight; level++)
{
nodesInLevel = 1 << (level - 1);
nodesInNextLevel = nodesInLevel;
spaces = (1 << (treeHeight - level + 1) - 1);
...
现在,这可能是因为我缺乏使用二元运算符的经验.我只是直接使用chat gpt来初始化这些变量(我现在后悔这个 idea 了).
但出于某种原因,输出结果如下所示:
5
/ \
3 45
/ \ / \
2 4 25 105
而不是我想要的,那就是:
5
/ \
3 45
/ \ / \
2 4 25 105
在构思/起草计划的概念时,我如何修正我的计算,甚至如何继续进行这些计算.
不确定这是否算作MCVE: 但这里是指向我的代码的链接,我所有的函数、 struct 和头文件都存储在这里. https://gist.github.com/SalManRAMc/fa636355cc042df3868b630e19ba8c97个