【问题标题】:Binary Search Tree C++ Implementation(dynamic memory problems)二叉搜索树 C++ 实现(动态内存问题)
【发布时间】:2015-06-05 09:11:58
【问题描述】:

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

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

【问题讨论】:

  • point* res = new point; 树应该负责创建节点,而不是 main()。如果用户正在做数据结构应该负责的大部分工作,那么数据结构有什么好处?
  • @PaulMcKenzie 我尝试的第一件事是由函数完成的“构造”。我把它改成了一个可能很糟糕的构造函数,然后我把它改成了这段代码。

标签: c++ binary-search-tree dynamic-memory-allocation


【解决方案1】:

除了你的代码很奇怪之外,我会在这里说:

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-&gt;parent 以指向局部变量locinsert() 函数返回后,point loc 不存在了。

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

【讨论】:

  • 是的,这就是我搜索的问题(动态内存被删除)。如何避免删除?关于第二点,是的,没错。我主要指的是封装(另一件事,为什么要封装?理论上,封装更适合编译器,对吧?)。
  • search() 函数应该返回一个指针。然后 it 可以在需要时分配新节点(即当near == true 并且未找到确切值时)。封装不适用于编译器,它主要用于将程序数据和对该数据进行操作的函数保存在一起。这种方式更易于维护。
猜你喜欢
  • 1970-01-01
  • 2013-05-03
  • 2016-02-03
  • 2015-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多