C++中引用传递指针问题:二叉树插入函数编译报错
解决方法
编译错误的核心原因是:GetLeftNode()、GetRightNode()和GetRoot()返回的是指针的临时副本(右值),而Node*&类型的非const引用必须绑定到可修改的左值(比如类的成员变量本身)。要保留引用传递的方式,只需修改节点获取函数的返回值类型为指针引用:
步骤1:修改节点获取函数的返回类型
将GetLeftNode()、GetRightNode()以及GetRoot()的返回值从Node*改为Node*&,让它们直接返回成员变量的引用:
// 修改后的左节点获取函数 Node*& GetLeftNode() { return this->left; } // 同理修改右节点获取函数 Node*& GetRightNode() { return this->right; } // 根节点获取函数也做同样修改 Node*& GetRoot() { return this->root; // 假设类中有Node* root成员 }
步骤2:验证递归调用
修改后,递归函数中的调用insertNodeInternal(v, selectedNode->GetLeftNode())就会直接传递selectedNode->left的引用,属于合法的左值,编译错误会消失。递归过程中对selectedNode的赋值(比如selectedNode = new Node(v))会直接修改对应的类成员指针,实现节点插入的逻辑。
修改后的完整代码片段示例
// Node类的成员变量声明 class Node { private: int value; Node* left = nullptr; Node* right = nullptr; public: Node(int v) : value(v) {} int GetValue() { return value; } Node*& GetLeftNode() { return left; } Node*& GetRightNode() { return right; } }; // 二叉树类的插入相关函数 class BinaryTree { private: Node* root = nullptr; void insertNodeInternal(int v, Node* &selectedNode){ if (selectedNode == nullptr) { selectedNode = new Node(v); } else if (v <= selectedNode->GetValue()) insertNodeInternal(v, selectedNode->GetLeftNode()); else insertNodeInternal(v, selectedNode->GetRightNode()); } public: Node*& GetRoot() { return root; } void insertNode(int v){ this->insertNodeInternal(v, GetRoot()); } };
内容的提问来源于stack exchange,提问作者petr chyla
相关产品推荐
相关产品推荐

