我有一张霍夫曼树,我试图将它打印到屏幕上,右边的树枝水平延伸,左边的树枝向下延伸。我的功能如下。 IsNodeNamSingleChar()只返回一个' *'如果节点是中间节点之一。
void PrintBranches(Node * Top)
{
if(Top == NULL){
return;
}
if(Top->right != NULL){
printf("-%c", IsNodeNameSingleChar(Top));
Top = Top->right;
PrintBranches(Top);
}
else{
printf("%c\n|\n", IsNodeNameSingleChar(Top));
Top = Top->left;
PrintBranches(Top);
}
}
我知道这不对,但我无法理解我应该如何解决它。目前,这打印出来(对于我正在使用的测试文件):
-* -* -*B
|
答案 0 :(得分:0)
我认为我有一个解决方案,我将以“伪类型”代码写出来...因为我认为你真正需要的是一种可以工作的算法......
....这个解决方案有两个相互调用的递归函数。
应该用
调用printNodeRight(&topNode, 0);
功能是......
int printNodeRight(Node * pTop, int indent)
{
if (current node pTop is not end of branch)
{
printf("*-");
printNodeRight(pTop->Right,indent+1);
printNodeLeft(pTop->Left,indent);
} else {
printf("%c\n", pTop->value);
for (loop indent times)
{
printf("| ");
}
printf("\n);
}
return 0;
}
int printNodeLeft(Node * pTop, int indent)
{
for (loop (indent-1) times)
{
printf("| ");
}
printNodeRight(pTop,indent);
return 0;
}
请注意,此代码应生成如下所示的树...
*-*-b
| |
| c
|
a
*-*-*-b
| | |
| | *-d
| | |
| | e
| |
| *-*-*-g
| | | |
| | | *-h
| | | |
| | | i
| | |
| | j
| |
| c
|
a
原始答案
由于文本打印到屏幕的方式,这是一项特别困难和有趣的挑战。
因此,例如,使用递归例程,将无法打印以下树
-*-*-b
| |
a c
因为你将从打印开始
-*-*-b
然后c将在b之后直接打印以获得
-*-*-bc
|
如果你将printf从“%c \ n | \ n”更改为“\ n | \ n%c”,你会得到
-*-*-b
|
c
但根本问题在于,使用递归功能,您将在>>打印之前打印c 。
您的问题出在
的第二行 -*-*-b
| |
a c
你需要在c之前打印一个,但是你的递归例程会在它到达之前到达c所以很难(不可能)回到c前面打印一个---当你得到打印第二行你需要知道有多少空格来打印c和a ....总体来说这是一个非常困难的挑战 - 可以通过左右上下左右移动光标来做到这一点。