Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从上到下横向打印BST_C++_Stl_Binary Search Tree - Fatal编程技术网

C++ 从上到下横向打印BST

C++ 从上到下横向打印BST,c++,stl,binary-search-tree,C++,Stl,Binary Search Tree,我有一个关于BST打印的问题。我可以使用不同的树打印算法横向打印树。但是,我总是从左到右打印树。那么有没有办法把这棵树倒过来打印呢?我看到了一些关于使用XY的想法,但我不想在控制台中这样做,所以有什么不同的方法来实现相同的事情吗 编辑:例如,我的输入为L、M、R、T、S、G、Y、S、D、E、C、A。使用顺序遍历,我得到了这个输入 Y T S R M L G E

我有一个关于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度一样,我应该在上面,后面跟着其他人

编辑2:下面是使用级别顺序打印树的代码,但是,我不确定如何将显示的格式设置为我想要的格式

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;
}

你是说?

你会怎么用手来做?这才是真正的问题;C++代码只是写下所有的步骤。我的方法是在中间打印顶部节点L,因此前面有40个空格。第二级节点,我会打印20克,然后在前面40米的空间。第三级,我会打印10个空格,然后是C,然后是20个空格,等等


也就是说,在深度D处,我有需要打印的2D元素,因此每个元素都获得线宽>>D宽度。

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

第一个功能-逐级打印根lv->离开lv 第二个功能-距新线起点的距离 第三个功能-打印节点并计算两次打印之间的距离;
输出:

树的实现是否有到其父节点的链接?如果是这样的话,我认为应该可以这样做。如果没有,那么你可以运行一个普通的打印并将这些值存储在一个数组中,然后向后遍历它,这将是非常低效的。你说的倒过来是什么意思?是的,有左指针和右指针。倒过来是指像实际的树一样从上到下打印树。@Spincel我想知道是否有指向树的指针节点的父节点,如if I do child->parent do I使节点1级别更接近根节点。我尝试过这样做,但是,我不确定如何精确地显示队列中的数据。
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