【问题标题】:Printing BST sideway from top to bottom从上到下横向打印 BST
【发布时间】:2012-03-25 23:12:59
【问题描述】:

我有一个关于 BST 打印的问题。我可以使用不同的树打印算法横向打印树。但是,我总是从左到右打印树。那么有没有办法把树倒过来打印呢?我看到了一些关于使用 XY 的想法,但我不想在控制台中这样做,那么有什么不同的方法可以实现同样的事情吗?

编辑:例如,我的输入为 L、M、R、T、S、G、Y、S、D、E、C、A。使用中序遍历,我得到了这个输入

              Y
          T
              S
       R
    M
 L
    G
          E
       D
          C
             A

我想要的就是向右旋转 90 度,L 应该在上面,然后是其他的。

编辑 2:这是使用 Level Order 打印树的代码,但是,我不确定如何将要显示的格式设置为我想要的。

queue<TreeNode*> q;

while(node != NULL)
{
    cout << node->data << " " << endl;
    if (node->left)
        q.push(node->left);
    if(node->right)
        q.push(node->right);
    if(!q.empty())
    {
        node = q.front();
        q.pop();
    }
    else
        node = NULL;
}

【问题讨论】:

  • 树的实现是否有指向其父节点的链接?如果是这样,我认为应该可以做到这一点。如果没有,那么您可以运行普通打印并将这些值存储在一个数组中,然后向后遍历它(虽然这将非常低效)。
  • “颠倒”是什么意思?
  • 是的,有左右指针。
  • 倒置意味着像实际的树一样从上到下打印树。
  • @Spincel 我想知道是否有指向节点的parent 的指针,就像我做child-&gt;parent 一样,我是否让节点1 级更接近根节点。

标签: c++ stl binary-search-tree


【解决方案1】:

你的意思是Breadth-First Search

【讨论】:

  • 我试过了,但是我不确定如何将队列中的数据显示为我想要的那样。
【解决方案2】:

您将如何手动执行此操作?这是真正的问题; C++ 代码只是写下所有步骤。我的方法是在中心打印顶部节点L,因此前面有 40 个空格。第二级节点,我会在前面打印 20 个(G)和 40 个(M)空格。第三级,我会打印 10 个空格,然后是 C,然后是 20 个空格,等等……

即在深度 D,我需要打印 2 个D 元素,因此每个元素都获得linewidth&gt;&gt;D 宽度。

【讨论】:

    【解决方案3】:

    这是我的代码。它打印得很好,可能不是完全对称。 小说明:

    • 第一个函数 - 逐级打印(根 lv -> 离开 lv)
    • 第二个函数 - 到新行开头的距离
    • 第三个函数 - 打印节点并计算两次打印之间的距离;

    void Tree::TREEPRINT()
    {
        int i = 0;
        while (i <= treeHeight(getroot())){
            printlv(i);
            i++;
            cout << endl;
        }
    }
    
    void Tree::printlv(int n){
        Node* temp = getroot();
        int val = pow(2, treeHeight(root) -n+2);
        cout << setw(val) << "";
        prinlv(temp, n, val);
    }
    
    void Tree::dispLV(Node*p, int lv, int d)
    {
        int disp = 2 * d;
        if (lv == 0){
            if (p == NULL){
    
                cout << " x ";
                cout << setw(disp -3) << "";
                return;
            }
            else{
                int result = ((p->key <= 1) ? 1 : log10(p->key) + 1);
                cout << " " << p->key << " ";
                cout << setw(disp - result-2) << "";
            }
        }
        else
        {
            if (p == NULL&& lv >= 1){
                dispLV(NULL, lv - 1, d);
                dispLV(NULL, lv - 1, d);
            }
            else{
                dispLV(p->left, lv - 1, d);
                dispLV(p->right, lv - 1, d);
            }
        }
    }   
    

    输入:

    50-28-19-30-29-17-42-200-160-170-180-240-44-26-27
    

    输出:https://i.stack.imgur.com/TtPXY.png

    【讨论】:

      猜你喜欢
      • 2010-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-23
      • 2011-04-04
      • 1970-01-01
      相关资源
      最近更新 更多