议程是使用ostream运算符打印AVL树的内容。内容必须以特定格式打印。

该树是使用模板实现的。
一个简单的主要实现。

AVLTree<int, float> tree;
for(int i = 0; i < 10; i++)
   tree.insert(i, i+0.1);
cout << tree;


Ostream运算符

friend ostream&  operator<<(ostream& out, const AVLTree& v)
{
    out << "{";
    v.print(out, v.root);
    out << "}";
    return out;
}


void print(AVLnode<KEY,INFO>* curr)const
    {
        if(curr)
        {
            print(curr->left);
            print(curr->right);
        }
    }

void print(ostream& out, AVLnode<KEY, INFO>* curr)const
    {
        if(curr)
        {
            print(out, curr->left);
            out << curr->Key_ << ": " << curr->Info_<<", ";
            print(out, curr->right);
        }
    }


我有两个打印辅助功能。

我得到的输出是

{1:1.1, 2:2.1. 3:3.1, 4:4.1, 5:5.1, 6:6.1, 7:7.1, 8:8.1, 9:9.1, }


所需的输出是

{1:1.1, 2:2.1. 3:3.1, 4:4.1, 5:5.1, 6:6.1, 7:7.1, 8:8.1, 9:9.1}


不应打印“,”,如何检测树的最后一个元素?我不了解情况。很简单,但我看不到。

最佳答案

考虑此问题的另一种方法是先打印逗号,而不要最后打印逗号。这样,您将永远不会看到逗号,因为它将是第一个打印的项目。

可以通过在辅助函数中引入bool引用变量(未测试)来实现:

friend ostream&  operator<<(ostream& out, const AVLTree& v)
{
    bool firstTime = true;
    out << "{";
    v.print(out, v.root, firstTime);
    out << "}";
    return out;
}


void print(ostream& out, AVLnode<KEY, INFO>* curr, bool& firstTime) const
{
    if (curr)
    {
       print(out, curr->left, firstTime);
       out << (firstTime?"":", ") << curr->Key_ << ": " << curr->Info_;
       firstTime = false;
       print(out, curr->right, firstTime);
    }
}


firstTime跟踪是否是第一次打印。如果是这种情况,则不打印逗号,否则打印逗号。

09-13 03:57