旋转二叉树

时间:2017-10-20 10:18:55

标签: c++ binary-tree

我正在尝试打印非静态二叉树。 它确实打印但向左旋转。我无法找到一种方法来纠正这个并让它直立旋转。 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);
    }
  }
}

输出:

预期产出:

2 个答案:

答案 0 :(得分:2)

递归方法与基于行的输出不相称,其中一行由多个子树中的项组成。

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

一个小的启动代码,它不会真正将树显示为树,但至少会在正确的行中显示每个节点。

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

请参阅代码注释,了解此代码中缺少的内容。我将dataType替换为int并使用了原始字段而不是getter函数,因为它与概念无关。

答案 1 :(得分:-1)

如果希望树的顶部出现在输出的顶部,则必须先将其输出 - 在其分支之前。

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

// 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 ";

您需要切换顺序:输出当前节点,然后输出分支。

此外,斜杠方向错误,需要更正缩进更改。左侧分支应缩进 less 而不是更多。

至少进行这些更改可以打印树&#34;自上而下&#34;。您仍然会发现分支不会彼此相邻 - 这需要一个更复杂的解决方案。