2015-03-31 56 views
1

我目前正在学习如何实现二叉搜索树,但使用更基本的C方法(请不要“现在使用类”)。但是,动态内存自身删除存在很大的问题。头值得到正确更新,但是,其他每一点都会被删除。谁能帮我?另外,如果你会提供一些技巧来强化我的树的实现,那将是很好的。该程序的基本概要:您输入一个字符,然后运行其中一个树的功能。但是请注意,这个实现是一个纯粹的BST,所以没有平衡。谢谢。二叉搜索树C++实现(动态内存问题)

#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 = &empty; 
    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; 
} 
+1

'point * res = new point;' 树应该负责创建节点,而不是'main()'。如果用户正在完成数据结构应负责的大量工作,那么数据结构有什么好处? – PaulMcKenzie 2015-03-31 21:43:38

+0

@PaulMcKenzie我尝试的第一件事是由函数完成的“构造”。我将其改为一个可能不太合理的构造函数,然后将其更改为此代码。 – ReaLNero 2015-04-01 17:02:41

回答

0

除了在你的代码更古怪我想说的是这里:

void insert(int pos, point* res){ 
    point loc = search(pos, true); 
    res->val = pos, res->left = &empty, res->right = &empty; 
    res->parent = &loc; // <=== here 

修改res->parent在一个局部变量loc点。在insert()函数返回point loc之后不再存在。

另外你已经在使用类;除了默认的成员可见性,C++结构和类几乎完全相同。

+0

是的,那是我搜索的问题(动态内存被删除)。如何避免删除? 关于第二点,是的,这是正确的。我主要是关于封装(另一件事,为什么封装?理论上,封装对于编译器来说更重要,对吧?)。 – ReaLNero 2015-04-01 17:00:14

+0

'search()'函数应该返回一个指针。然后* it *可以根据需要进行新节点的分配(即,当'near == true'并且没有找到确切的值时)。封装不适用于编译器,它主要用于保存对这些数据进行操作的程序数据和函数。这种方式更具可维护性。 – haavee 2015-04-02 06:59:52