C++中Const类型的困境

Dilemma of Const type in C++

本文关键字:困境 类型 Const C++      更新时间:2023-10-16

我正在尝试使用递归在c++中实现BST。然而,我发现自己陷入了进退两难的境地。

Insert函数中,我使用引用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

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

#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);
    }
}