C++ 旋转二叉树

C++ 旋转二叉树,c++,binary-tree,C++,Binary Tree,我试图打印一个非静态二叉树。 它可以打印,但会向左旋转。我找不到一个方法来纠正这一点,并使其垂直旋转。5是根节点。代码: template <class dataType> void displaybinarytree(BinaryTree <dataType> * p, int indent) { if(p != NULL) { if(p->right()) { displaybinarytree(p->right(), indent

我试图打印一个非静态二叉树。 它可以打印,但会向左旋转。我找不到一个方法来纠正这一点,并使其垂直旋转。5是根节点。代码:

template <class dataType>
void displaybinarytree(BinaryTree <dataType> * p, int indent)
{
if(p != NULL) {
    if(p->right()) {
        displaybinarytree(p->right(), indent+4);
    }

    if (indent) {
        cout << setw(indent) << ' ';
    }

    if (p->right()){
        cout<<" /\n" << setw(indent) << ' ';
    }

    cout<< p->getData() << "\n ";

    if(p->left()) {
        cout << setw(indent) << ' ' <<" \\\n";
        displaybinarytree(p->left(), indent+4);
    }
  }
}
模板
void displaybinarytree(BinaryTree*p,int缩进)
{
如果(p!=NULL){
如果(p->right()){
显示二进制树(p->right(),缩进+4);
}
如果(缩进){

cout如果希望树的顶部显示在输出的顶部,则必须先输出它,然后再输出分支

您的代码首先输出右分支,因此它出现在输出的顶部:

// Outputs right branch:
if(p->right()) {
    displaybinarytree(p->right(), indent+4);
}

if (indent) {
    cout << setw(indent) << ' ';
}

if (p->right()){
    cout<<" /\n" << setw(indent) << ' ';
}

// Outputs "current" node:
cout<< p->getData() << "\n ";
//输出右分支:
如果(p->right()){
显示二进制树(p->right(),缩进+4);
}
如果(缩进){

cout递归方法不能很好地处理基于行的输出,其中一行由多个子树中的项组成

您应该切换到宽度优先遍历,在该遍历中,您可以为每个树级别创建一个工作集。您可能需要预先计算较低树级别的空间需求,以便在较高级别中输出所需的对齐

这是一个小的开始代码,它不会真正将树显示为树,但至少会在正确的行中显示每个节点

void displaybinarytree(BinaryTree <int> * p, int indent)
{
    deque<BinaryTree<int>*> current;
    deque<BinaryTree<int>*> next;
    next.push_back(p);

    while (!next.empty())
    {
        current.swap(next);
        while  (!current.empty())
        {
            BinaryTree<int>* node = current.front();
            current.pop_front();
            if (node->left)
            {
                next.push_back(node->left);
            }
            if (node->right)
            {
                next.push_back(node->right);
            }
            // instead of a single space, appropriate spacing is needed
            cout << " " << node->data;
        }
        // instead of a single newline, appropriate spacing and connector characters / \ are needed
        cout << endl;
    }
}
void displaybinarytree(BinaryTree*p,int缩进)
{
德克电流;
德克下;
下一步,将_向后推(p);
而(!next.empty())
{
当前交换(下一个);
而(!current.empty())
{
BinaryTree*节点=current.front();
current.pop_ufront();
如果(节点->左)
{
下一步。推回(节点->左);
}
如果(节点->右侧)
{
下一步。推回(节点->右侧);
}
//需要适当的间距,而不是单个空间

不能显示实际和预期输出的图像,请以文本形式输入(特别是以四个空格作为前缀的固定宽度文本)。感谢预期的输出,但我们仍然需要一个,这是您运行的生成图片中的输出的代码。这是错误的。它比这更复杂。您需要同时打印左分支和右分支!11、13和4需要打印在同一行上。我不明白。“预期输出”的图像显示并排打印的分支。这正是OP存在的问题。@MartinBonner这没有错,只是不是一个完整的解决方案。在底部添加了一条注释来说明这一点。OP当前有11、13、4行(垂直,而不是所需的水平)。您的代码不会将它们保留在一行中。它只是“旋转”MartinBonner OP特别询问旋转树的情况。他的输出中的根在左边,而不是顶部,它的子项在它的右边,而不是(除了左边的子项)下面。我的答案解释了原因。我已经解释了如何将树根放在顶部,将树根放在下面,并将树根放在正确的一侧。解决方案的下一步是将树根并排打印在同一行上,但这个答案解决了书面问题(关于旋转树)我觉得它很有用。更简单的选择是忽略(大概是排版)示例图像,只需将每个级别的间距增加一倍