2010-10-10 258 views
4

我一直在学习如何在C++中使用链表来编程二叉树搜索。一切正常,我知道二叉树是如何工作的,但是我希望能够在顶部的头部和所有节点打印树下面的波纹管,因为我试图证明这里:如何垂直打印二叉树搜索类?

         [root or head] 
          [left]     [right] 

         [left]  [right]  [left]  [right] 

我使用控制台打印树,因此可以随意使用'cout'或'printf'。我相信我需要设置控制台的宽度,但我不知道如何启动。

感谢,Y_Y

+1

Y:抽象类标签与你的问题有什么关系? :) – 2010-10-10 08:51:35

+1

如果您想以这种对称方式进行操作,您需要知道在advance_中打印_index所需的数据的深度和长度,以便正确对齐父节点。使用左对齐输出可能会更容易。 – sbi 2010-10-10 08:52:09

回答

6

由于SBI提到,使得左对齐版本比中心对齐一个更容易。但是,选择基本算法的方法应该是:

横向树宽度优先。通过使用队列以下算法,这样做:

  1. 声明一个队列
  2. 根节点添加到队列
  3. 虽然队列包含多个节点,做4 - 6:
  4. 出队节点
  5. 打印节点。在每次打印 比第2次幂次(从1开始)小1之后,也打印换行符 。
  6. 排队节点的孩子

(见http://www.cs.bu.edu/teaching/c/tree/breadth-first/

为了打印中心对齐的树,也请执行下列操作(如果树是完整的才有效。如果它不完整,做最简单的办法就是让一个完整的副本,每一个应该有一个节点处获得某种空节点的):

  • 除了打印到屏幕上, “打印”每一行到字符串字符串数组。
  • 随着时间的推移,记录您打印的最长元素 的字符长度 。我们称之为maxElemLen 。
  • 无论何时打印元素,在它之前打印 一个制表符,并在其后面打印一个 制表符。
  • 最后回去,并在 阵列中的每一行,用2 ^(nLines - lineNum)制表符替换 的每个制表符。
  • 然后展开每个选项卡或换行符来 maxElemLen + 1个空间后自带 选项卡,扩大别的后到来每个 标签 (即,印刷ELEM后)至(maxElemLen + 1 - (所述 自 最后一个标签以来经过的字符数))空格。
  • 最后,按顺序打印您的 数组的每一行。
+1

请注意,“在每次打印之后,第二次打印的第二次(从0开始)之后,还会打印换行符。”只有在树完整时才是正确的。如果没有完成,你需要一种不同的方式来跟踪你什么时候完成一个关卡。 – AlcubierreDrive 2010-10-10 09:21:13

+0

@Jon:我猜这个问题的重要部分是什么? – 2010-10-10 09:23:43

+0

@阿门:这不是在第一句话中处理的。 – sbi 2010-10-10 09:26:18

3

这是打印二叉树的代码 - 下面代码打印二叉树从左至右时尚

private void printTree(Node nNode,int pos){ 
    if (nNode==null) { 
     for(int i=0;i<pos;i++) System.out.print("\t"); 
     System.out.println("*"); 
     return; 
    } 
    printTree(nNode.right,pos+1); 
    for(int i=0;i<pos;i++) System.out.print("\t"); 
    System.out.println(nNode.data); 
    printTree(nNode.left,pos+1); 
} 

下面是上述方法的输出

enter image description here

“* '在上面的输出中表示空

+1

因此,我们倾斜头部以获得预期的输出? – Thomas 2013-10-13 07:07:32

+0

是的,很容易看到小树。 – IsAs 2013-10-13 07:36:44

+0

非常好的解决方案! – BajaBob 2014-03-20 22:10:04

1

@ IsAs的解决方案。 C++ 90度CCW旋转树。我建议将它用于不大于2^4的树上。

print(root); 
void BinarySearchTree::print(BinaryNode* n, int pos = 0){ 
    if (n==NULL) { 
     for(int i = 0; i < pos; ++i) 
      cout << "\t"; 
     cout << 'X' << endl; 
     return; 
    } 
    print(n->right,pos+1); 
    for(int i = 0; i < pos; i++) 
     cout << "\t"; 
    cout << n->key << endl; 
    print(n->left,pos+1); 
}