首页 > 解决方案 > 如何在二叉树类中正确重载运算符 << ?

问题描述

我一直想做一棵二叉树,所以我在这里做实验,我碰壁了,更具体地说,用运算符 <<输出二叉树。目前它所做的是,打印那个参考我假设的值,如果我尝试将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;
}

标签: c++binary-tree

解决方案


问题 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)

不是有效的流运算符。运算符重载的基本规则和习语是什么?所以没有必要重复

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

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


推荐阅读