如何修复我的功能以打印霍夫曼树到屏幕?

时间:2015-12-12 22:35:16

标签: c recursion binary-tree nodes huffman-code

我有一张霍夫曼树,我试图将它打印到屏幕上,右边的树枝水平延伸,左边的树枝向下延伸。我的功能如下。 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
|

1 个答案:

答案 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 ....总体来说这是一个非常困难的挑战 - 可以通过左右上下左右移动光标来做到这一点。