我正在尝试打印非静态二叉树。 它确实打印但向左旋转。我无法找到一种方法来纠正这个并让它直立旋转。 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);
}
}
}
输出:
预期产出:
答案 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;。您仍然会发现分支不会彼此相邻 - 这需要一个更复杂的解决方案。