C++ 旋转二叉树
我试图打印一个非静态二叉树。 它可以打印,但会向左旋转。我找不到一个方法来纠正这一点,并使其垂直旋转。5是根节点。代码: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
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特别询问旋转树的情况。他的输出中的根在左边,而不是顶部,它的子项在它的右边,而不是(除了左边的子项)下面。我的答案解释了原因。我已经解释了如何将树根放在顶部,将树根放在下面,并将树根放在正确的一侧。解决方案的下一步是将树根并排打印在同一行上,但这个答案解决了书面问题(关于旋转树)我觉得它很有用。更简单的选择是忽略(大概是排版)示例图像,只需将每个级别的间距增加一倍