如何垂直打印二叉树搜索类?

时间:2010-10-10 08:46:27

标签: c++

我一直在学习如何使用C ++中的链接列表编写二叉树搜索。一切正常,我理解二进制树是如何工作的,但是我希望能够打印出头部顶部的树,以及下面的所有节点,我试图在这里展示:

                                     [root or head]
                            [left]                    [right]

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

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

谢谢,Y_Y

3 个答案:

答案 0 :(得分:6)

正如sbi所提到的,制作左对齐版本比中心对齐版本更容易。但无论你选择哪种对齐,你的基本算法都应该是:

首先遍历树的广度。通过使用具有以下算法的队列来执行此操作:

  1. 声明队列
  2. 将根节点添加到队列
  3. 虽然队列包含更多节点,但请执行4 - 6:
  4. 将某个节点出列
  5. 打印节点。每次打印后 也就是说,这比第二次(从1开始)的功率小一个 打印换行符。
  6. 将节点的子节点入队
  7. (见http://www.cs.bu.edu/teaching/c/tree/breadth-first/

    为了打印中心对齐的树,也要执行以下操作(仅在树完成时才有效。如果它不完整,最简单的方法是在每个应该有节点的地方进行完整复制某种空节点):

    • 而不是打印到屏幕上, 将每行“打印”成一个字符串 一串字符串。
    • 随着时间的推移,跟踪长度 在最长元素的字符中 你打印。我们称之为 maxElemLen。
    • 无论何时打印元素,都要打印 它前面的一个制表符和一个 它之后的制表符。
    • 最后,回去吧 更换数组中的每一行 每个制表符有2 ^(nLines - lineNum)制表符。
    • 然后展开来的每个标签 在制表符或换行符之后 maxElemLen + 1个空格,并展开每个空格 之后的标签 (即印刷后的elem)至(maxElemLen + 1 - ( 自那以来经过的字符数 最后一个标签))空格。
    • 最后,打印你的每一行 数组,按顺序。

答案 1 :(得分: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

上面输出中的

'*'表示空

答案 2 :(得分:1)

@ IsAs的解决方案。 90度CCW在C ++中旋转树。我建议这个用在不超过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);
}