双类型模板AVL树运算符重载及find函数实现问题咨询
核心问题解答
1. 无需重载运算符即可实现find/contains功能
你当前编写的find逻辑框架本身不需要重载DSAVLTree的运算符,find功能仅依赖模板参数t(也就是树的键类型)已经实现的==和<比较运算符,和你正在开发的树的operator==属于完全独立的两个需求,互不影响。
2. 现有代码的问题梳理
operator==逻辑完全错误:当前实现仅能判断两棵树均为空的场景,没有递归遍历左右子树做节点维度的对比,自然无法访问叶子节点,也无法判断非空树是否相等。- 拷贝构造函数语法错误:代码中
*this = right的right变量不存在,应该改为*this = rhs,且你尚未实现赋值运算符operator=,运行时会直接报错。 - find返回值无对外可用性:public版本的find返回私有内部类
AVLNode的指针,外部代码没有权限访问AVLNode的成员,建议将对外暴露的find改为返回键值对,或是新增contains接口返回布尔值。 - 缺少const版本的成员函数:当前的find方法是非const的,const修饰的DSAVLTree实例无法调用find/contains接口。
3. 修正代码示例
3.1 正确实现operator==(可选,仅当你需要判断两棵树完全相等时才需要)
首先新增私有递归辅助函数:
private: bool isEqual(AVLNode<t,s>* a, AVLNode<t,s>* b) const { if (a == nullptr && b == nullptr) return true; if (a == nullptr || b == nullptr) return false; // 依次对比当前节点的键、值,以及左右子树 return (a->data == b->data) && (a->vectorToBe == b->vectorToBe) && isEqual(a->left, b->left) && isEqual(a->right, b->right); }
修正operator==实现:
public: bool operator==(const DSAVLTree<t,s>& otherTree) const { return isEqual(root, otherTree.root); }
3.2 实现contains接口(无需重载树的运算符)
补充const版本的find,再封装contains:
public: // 对外暴露的contains接口 bool contains(const t& key) const { return find(root, key) != nullptr; } // 补充const版本的私有find const AVLNode<t,s>* find(AVLNode<t, s> *tree, const t& dta) const { if(tree == nullptr){ return nullptr; } if(tree->data == dta){ return tree; } else if (dta < tree->data){ return find(tree->left, dta); } else { return find(tree->right, dta); } }
内容的提问来源于stack exchange,提问作者Nicole Sood
相关产品推荐
相关产品推荐

