二进制搜索树C++实现(动态内存问题)
我目前正在学习如何实现二叉搜索树,但使用更基本的C方法请不要使用类。然而,动态内存本身被删除存在一个大问题。head值得到正确更新,但是,每隔一个点就会被删除一次。有人能帮我吗?另外,如果您能提供一些技巧来加强我对树的实现,那就太好了。程序的基本运行情况:输入一个字符,然后运行树的一个函数。但是请注意,这个实现是一个纯粹的BST,因此没有平衡。多谢各位二进制搜索树C++实现(动态内存问题),c++,binary-search-tree,dynamic-memory-allocation,C++,Binary Search Tree,Dynamic Memory Allocation,我目前正在学习如何实现二叉搜索树,但使用更基本的C方法请不要使用类。然而,动态内存本身被删除存在一个大问题。head值得到正确更新,但是,每隔一个点就会被删除一次。有人能帮我吗?另外,如果您能提供一些技巧来加强我对树的实现,那就太好了。程序的基本运行情况:输入一个字符,然后运行树的一个函数。但是请注意,这个实现是一个纯粹的BST,因此没有平衡。多谢各位 #include <iostream> struct point{ point* parent, *left, *righ
#include <iostream>
struct point{
point* parent, *left, *right;
int val = -1;
};
point* biggest;
point empty;
point search(int pos, bool near, point* loc = biggest){
if(loc->val == pos){
return *loc;
} else if(loc->left->val != -1 and loc->val > pos){
return search(pos, near, loc->left);
} else if(loc->right->val != -1){
return search(pos, near, loc->right);
}
if(near){
return *loc;
} else{
point fail;
return fail;
}
}
void insert(int pos, point* res){
point loc = search(pos, true);
res->val = pos, res->left = &empty, res->right = &empty, res->parent = &loc;
if(loc.val < res->val){
loc.left = res;
} else{
loc.right = res;
}
}
void remove(int pos){
}
int pred(int pos){
point res = search(pos, false);
if(res.val == -1){
return -1;
}
}
int succ(int pos){
point res = search(pos, false);
if(res.val == -1){
return -1;
}
}
void inorder(point* pos = biggest){
if(pos->left->val != -1){
inorder(pos->left);
}
std::cout << pos->val << " ";
if(pos->right->val != -1){
inorder(pos->right);
}
}
int main() {
point start;
start.parent = &empty, start.left = &empty, start.right = ∅
biggest = &start;
char c;
int pos;
do{
std::cin >> c >> pos;
switch (c){
case 'S':
std::cout << search(pos, false).val << std::endl;
break;
case 'I':
if(biggest->val == -1){
start.val = pos;
} else{
point* res = new point;
insert(pos, res);
}
break;
case 'R':
remove(pos);
break;
case 'P':
std::cout << pred(pos) << std::endl;
break;
case 'N':
std::cout << succ(pos) << std::endl;
break;
case 'O':
inorder();
std::cout << std::endl;
break;
}
} while(c != '0');
return 0;
}
除了代码中的许多奇怪之处之外,我想在这里说:
void insert(int pos, point* res){
point loc = search(pos, true);
res->val = pos, res->left = &empty, res->right = ∅
res->parent = &loc; // <=== here
修改res->parent以指向局部变量loc。插入函数返回后,点loc不再存在
此外,您已经在使用类;C++结构和类几乎是相同的…除了默认成员可见性之外。point*res=新点;树应该负责创建节点,而不是主节点。如果用户正在做数据结构应该负责的一大块工作,那么数据结构有什么好处?@PaulMcKenzie我尝试的第一件事是由函数进行构造。我把它改成了一个可能是拙劣的构造函数,然后我把它改成了这段代码。是的,这就是我搜索动态内存时发现的问题,它自己被删除了。如何避免删除?关于第二点,是的,没错。我主要是指封装另一件事,为什么是封装?从理论上讲,封装更适合编译器,对吗?搜索函数应该返回一个指针。然后,如果需要,它可以分配新节点,即当near==true且未找到确切值时。封装不适用于编译器,它主要用于将程序数据和操作该数据的函数保存在一起。这样更易于维护。