c++ - 如何在二叉树类中正确重载运算符 << ?
问题描述
我一直想做一棵二叉树,所以我在这里做实验,我碰壁了,更具体地说,用运算符 <<输出二叉树。目前它所做的是,打印那个参考我假设的值,如果我尝试将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)
不是有效的流运算符。运算符重载的基本规则和习语是什么?所以没有必要重复
问题 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;
}
但是您需要弄清楚哪种遍历适合您。警告:以上是递归的,可能会超出大树的堆栈。
推荐阅读
- python - PyQt5 中 QLabel 的 FontSize 动画
- java - 如何@SQLDelete、软删除、带有复合键的实体
- android - FCM 测试通知由设备接收,但公共设备不接收
- java - Spring book 抛出 Field postRepository in required 一个找不到的“repository.PostRepository”类型的bean
- vue.js - 使用 laravel-mix 构建 SCSS 设置
- azure-devops - 批处理文件如何设置构建任务错误?
- python - 最大长度和每个元素最大重复值的组合
- pysimplegui - PySimpleGUI:列/帧的索引
- javascript - 在 Shiny 中使用 `waiter` 包会导致带有 `DT` 对象的 JS 错误
- php - 带有 Join 的 Laravel Querybuilder 方法未在 laravel 中调用访问器