【问题标题】:How to print out a BST in C++如何在 C++ 中打印出 BST
【发布时间】:2011-01-15 13:45:03
【问题描述】:

我的 C++ 程序创建了一个二叉搜索树。我知道如何按预购、后购和按序打印值。

但是,我想做一些更困难的事情。我想打印出有人在纸上画树时的样子。它的根在顶部的中心,它的左子节点在它的正下方和左侧,它的右子节点在它的正下方和右侧。其余节点将相应绘制。

我该怎么做?

【问题讨论】:

    标签: c++ printf binary-tree nodes


    【解决方案1】:

    嗯,在终端中很难......因为它可能不适合。但是有一些绘图库可以为您制作精美的图片。有graphvis是最受欢迎的之一。

    编辑: 如果您真的只是想打印文本,graphvis 有一种标记语言,用户可以将其传递给 graphvis,从而制作精美的图片。

    【讨论】:

      【解决方案2】:

      一种方法是使用graphviz。具体来说,使用它的“dot”程序,但是让输出看起来完全像你描述的那样是不可能的。

      【讨论】:

      • 我希望输出到终端。
      【解决方案3】:

      This article 包含您需要的代码,似乎:

      alt text http://www.cpp-programming.net/wp-content/uploads/2007/12/ascii_tree.jpg

      编辑:该网站离线

      这里是another one,正在探索其他一些选项。

      【讨论】:

        【解决方案4】:

        这是执行此操作的近似伪代码。基本思想是逐层遍历树,将每一层中的所有节点打印在一行上。每个节点之间的间距是其下方节点的两倍。由于这棵树的深度并不完全一致,因此人为地用虚拟节点填充它以占据不存在节点的空白区域。

        measure the depth of the tree, call that D
        have two queues, called Q1 and Q2
        enque the top node of the tree in Q1
        for (i = D; --i>=0; ){
          foreach node in Q1 {
        
            on first iteration of this inner loop, print 2^i - 1 spaces,
            else print 2^(i+1) - 1 spaces.
        
            if node == null print blank
            else print node.value
        
            if node.left exists enque node.left in Q2
            else enque null in Q2
        
            if node.right exists enque node.right in Q2
            else enque null in Q2
          }
          copy Q2 to Q1
          clear Q2
          print end-of-line
        }
        

        打印的每个空格是一个数字字段的宽度。假设树的深度 D = 4。然后打印如下:

        // it looks like this, and the space sequences are
        i = 3: -------n 7
        i = 2: ---n-------n 3 7
        i = 1: -n---n---n---n 1 3 3 3
        i = 0: n-n-n-n-n-n-n-n 0 1 1 1 1 1 1 1
        

        【讨论】:

          【解决方案5】:
              void print(node *p,int start)
              {
                  start++;
                  if (p->right != NULL)
                  {
                      print(p->right,start);
                  }
                  for (int i = 0; i <= start; i++)
                  {
                      cout<<"    ";
                  } 
                  cout << p->value<<endl;
                  if (p->left != NULL)
                  {
                      print(p->left, start);
                  }
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-10-09
            • 1970-01-01
            • 2012-08-10
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多