C++类递归遍历函数如何实现无参调用自动传入私有root成员
修复Tree类先序遍历接口调用问题
报错根因
C++ 中成员函数的默认参数是在函数调用位置求值,不属于成员函数内部的执行上下文,而this指针仅在非静态成员函数内部才合法,因此直接将this->root设为默认参数会触发编译错误。
最优修复方案
完全不需要改为迭代实现,原有递归逻辑可以完整保留,仅需通过函数重载做一层接口封装即可:
- 对外暴露无参的
preOrder公开接口,内部自动传入私有根节点 - 将原有带节点参数的递归版本改为私有成员,仅允许内部调用
修改后代码如下:
class Tree { public: ... // 外部调用的公开接口 void preOrder() { preOrder(root); } private: TreeNode* root = nullptr; // 内部递归使用的私有实现 void preOrder(TreeNode* node) { if (node != nullptr) { cout << node->key << " "; preOrder(node->left); preOrder(node->right); } } };
修改后外部就可以直接通过Tree.preOrder();调用,不需要传入任何参数,也不会暴露内部的私有root成员。
其他可选方案(不推荐)
如果不想拆分两个函数,也可以将参数默认值设为nullptr,在函数内部做判断替换:
class Tree { public: ... void preOrder(TreeNode* node = nullptr) { TreeNode* curr = node == nullptr ? root : node; if (curr != nullptr) { cout << curr->key << " "; preOrder(curr->left); preOrder(curr->right); } } private: TreeNode* root = nullptr; };
该方案的缺点是对外暴露了接收TreeNode参数的接口,外部仍然可以传入任意节点,不符合封装需求。
内容的提问来源于stack exchange,提问作者Tan Nguyen
相关产品推荐
相关产品推荐

