如何在二叉树 class 中正确重载运算符 << ?

How to overloard correctly the operator << , in a binary tree class?

我一直想做一个二叉树,所以我在这里做实验,我碰到了一个,更具体地说,输出 带有 运算符 << 的二叉树。目前它所做的是,打印我假设的那个值的 reference,并且如果我尝试将 obj 更改为 *obj,我会出错。(我知道这样,当前程序将仅输出根值).

额外问题:如何使 writeStuff() 函数正确输出整棵树?

我的代码:

#include <iostream>
#include <vector>

class binFa
{
    char value;
    binFa *righElem;
    binFa *leftElem;

  public:
    binFa(char elem) : value(elem)
    {
        rightElem = NULL;
        leftElem = NULL;
    }
    binFa(const binFa &fa)
    {
        value = fa.value;
        rightElem = new binFa(fa.rightElem->value);
        leftElem = new binFa(fa.leftElem->value);
    }
    binFa &operator<<(char elem)
    {
        if (elem == '0')
            leftElem = new binFa(elem);
        else
            rightElem = new binFa(elem);
        return *this;
    }
    void writeStuff(binFa *fa)
    {
        std::cout << fa->value << " ";
        if (fa->rightElem != NULL || fa->leftElem != NULL)
        {
            writeStuff(fa->leftElem);
            writeStuff(fa->rightElem);
        }
    }
    std::ostream &operator<<(std::ostream &os)
    {
        os << this->value;
        return os;
    }
};

int main()
{
    binFa *obj = new binFa('/');
    *obj << '0' << '1' << '0';
    std::cout << obj;
    obj->writeStuff(obj);
    delete obj;
    return 0;
}

问题 1

binFa *righElem;

一个愚蠢的错字。

binFa *rightElem;

看起来不错。

问题 2

std::cout << obj;

obj是指针,当然打印出来的是地址。不要使用指针。这里不需要动态分配。

int main()
{
    binFa obj('/');
    obj << '0' << '1' << '0';
    std::cout << obj;
//    obj.writeStuff(&obj); ignoring. One question at a time, please
    return 0;
}

问题 3

std::ostream &operator<<(std::ostream &os)

不是有效的流运算符。 What are the basic rules and idioms for operator overloading? 涵盖得很好所以没有必要重复它

问题 4

人们会期望 std::cout << obj; 打印出整棵树,所以

friend std::ostream &operator<<(std::ostream &os,
                                const binFa & bin)
{
    os << bin.value;
    return os;
}

可能不会剪掉它。你想要什么样的遍历?对树遍历算法进行一些研究。一个简单的方法:

friend std::ostream &operator<<(std::ostream &os,
                                const binFa & bin)
{
    os << bin.value;
    if (bin.rightElem)
    {
        os << *bin.rightElem;
    }
    if (bin.leftElem)
    {
        os << *bin.leftElem;
    }
    return os;
}

但你需要弄清楚哪种遍历方式适合你。警告:以上是递归的,可能会溢出大树的堆栈。