C+中Const类型的困境+; 我尝试用递归实现C++中的BST。然而,我发现自己进退两难
在插入函数中,我使用referenceC+中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_
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版本。请不要只复制粘贴代码作为答案。也需要一些解释。