C+中Const类型的困境+; 我尝试用递归实现C++中的BST。然而,我发现自己进退两难

C+中Const类型的困境+; 我尝试用递归实现C++中的BST。然而,我发现自己进退两难,c++,insert,constants,binary-search-tree,C++,Insert,Constants,Binary Search Tree,在插入函数中,我使用referenceTreeNode*&node传递函数参数。我不想将引用设为常量,因为我需要在Insert函数中更改节点。另一方面,当我调用像tree.Insert(10,tree.Getroot())这样的函数时,会发生错误,因为函数Getroot创建了不能分配给非常量引用的临时变量。我知道我可以通过公开TreeNode*root来轻松修复它,但我不想这样做 我应该怎么做来修复它,还是有更好的设计?请帮忙,提前谢谢。 这是头文件 #ifndef BINARY_SEARCH_

在插入函数中,我使用reference
TreeNode*&node
传递函数参数。我不想将引用设为常量,因为我需要在Insert函数中更改节点。另一方面,当我调用像
tree.Insert(10,tree.Getroot())
这样的函数时,会发生错误,因为函数
Getroot
创建了不能分配给非常量引用的临时变量。我知道我可以通过公开
TreeNode*root
来轻松修复它,但我不想这样做

我应该怎么做来修复它,还是有更好的设计?请帮忙,提前谢谢。 这是头文件

#ifndef BINARY_SEARCH_TREE_H
#define BINARY_SEARCH_TREE_H

class TreeNode
{
public:
  TreeNode(int x = 0,TreeNode* l = nullptr, TreeNode* r = nullptr)
  : element(x), left(l), right(r) { }

  int element;
  TreeNode* left;
  TreeNode* right;
};


class BST
{
public:
  BST(TreeNode *t = nullptr) : root(t) {}

  void Insert(int x, TreeNode*& node)
  {
    if (node == nullptr) {
      node = new TreeNode(x, nullptr, nullptr);
      if (node == nullptr)
        std::cout << "Insert Failure" << std::endl;
    }
    else if (node->element < x) {
      Insert(x, node->right); //easy to make a mistake
    }
    else if (node->element > x) {
      Insert(x, node->left);
    }
  }

  TreeNode *Getroot()
  {
    return root;
  }

private:
  TreeNode* root;
};

#endif
\ifndef二进制搜索树
#定义二进制搜索树
三烯类
{
公众:
TreeNode(int x=0,TreeNode*l=nullptr,TreeNode*r=nullptr)
:元素(x),左(l),右(r){
int元素;
TreeNode*左;
TreeNode*对;
};
BST级
{
公众:
BST(TreeNode*t=nullptr):根(t){}
无效插入(int x、TreeNode*&节点)
{
if(node==nullptr){
节点=新树节点(x,nullptr,nullptr);
if(node==nullptr)
std::cout right);//容易出错
}
else if(节点->元素>x){
插入(x,节点->左侧);
}
}
TreeNode*Getroot()
{
返回根;
}
私人:
树根;
};
#恩迪夫

在节点级和树级实现插入。然后,插入逻辑应该由树在根级别处理,或者由插入的节点在深度处理。我实现了一个示例树。它可能不是最好的实现,但可能对您有用。

\ifndef\uu BINARYTREENODE__
#ifndef __BINARYTREENODE__
#define __BINARYTREENODE__

class BinaryTreeNode {

public:
    BinaryTreeNode(int);
    int element;
    BinaryTreeNode *left;
    BinaryTreeNode *right;
};

#endif /* __BINARYTREENODE__ */


    #ifndef __BINARYSEARCHTREE__
    #define __BINARYSEARCHTREE__

    #include "BinaryTreeNode.h"

    using namespace std;

    class BinarySearchTree {

    public:
        BinarySearchTree();
        ~BinarySearchTree();
        void insert(int);

    private:
        BinaryTreeNode *root;
        void insert(int, BinaryTreeNode * & n);

    };

    #endif /* __BINARYSEARCHTREE__ */


#include "BinarySearchTree.h"
#include <iostream>
using namespace std;

BinarySearchTree::BinarySearchTree(){}

void BinarySearchTree::insert(int element)
{
    insert(element, this->root);
}
void BinarySearchTree::insert(int element, BinaryTreeNode* & n)
{
    if (n == 0)
    {
        n = new BinaryTreeNode(element);
    }
    else if (n->element > element)
    {
        insert(element, n->left);
    }
    else if (n->element < element)
    {
        insert(element, n->right);
    }
}
#定义二元树节点__ 二元树烯类{ 公众: 二叉树烯(int); int元素; 二叉树烯*左; 二元树烯*对; }; #endif/*.\uuu二元树节点\uu*/ #ifndef\uuu二进制搜索树__ #定义二元搜索树__ #包括“BinaryTreeNode.h” 使用名称空间std; 类二进制搜索树{ 公众: 二进制搜索树(); ~BinarySearchTree(); 空白插入(int); 私人: 二叉树烯*根; 无效插入(int、BinaryTreeNode*&n); }; #endif/*\uuu二元搜索树\uu*/ #包括“BinarySearchTree.h” #包括 使用名称空间std; BinarySearchTree::BinarySearchTree(){} void二进制搜索树::插入(int元素) { 插入(元素,此->根); } void二进制搜索树::insert(int元素,二进制树节点*&n) { 如果(n==0) { n=新的二元树烯(元素); } else if(n->element>element) { 插入(元素,n->左); } else if(n->element右侧); } }
树不应在公共接口中公开其节点类型-使其成为树的私有节点。公共功能应为
void Insert(int x)
GetRoot
根本不应该存在。一旦隐藏了实现细节,许多问题就会消失。如果指针为nullptr,您可能知道Insert不会插入任何内容。请重新考虑您的设计谢谢。你的实现真的很有帮助。我发现了一个更好的BST版本。请不要只复制粘贴代码作为答案。也需要一些解释。