【问题标题】:Segmentation Fault in Binary Tree二叉树中的分段错误
【发布时间】:2012-04-05 23:37:36
【问题描述】:

当我尝试插入二叉搜索树时,我的程序出现分段错误。这是节点的声明:

template < class T > class binTreeNode {
friend class binTree < T >;
friend class binSTree < T >;
public:
    // default constructor
    binTreeNode ( const T& newData =T( ), binTreeNode < T >* newLeft = 0, binTreeNode < T >* newRight = 0 ) {
        data = newData;
        left = newLeft;
        right = newRight;
    }
private:
    T data; // data value in node
    binTreeNode < T > *left, *right; // links to other nodes
};

下面的函数都是新的,其他的(比如高度函数和构造函数)都是在父类中完成的,应该不相关。新功能是:

template <class T>
class binSTree : public binTree<T> {
public:
    void insert (const T& newData) {
        if (root == NULL) {
            root = new binTreeNode<T>(newData);
        }
        else
            insert(root,newData);
    }
    bool search (const T& x) const {
        if (root != NULL)
            return search(root,x);
        else
            return false;
    }
    bool remove (const T& x) {
        if (root == NULL)
            return false;
        remove(root,x);
        return true;
    }
protected:
    binTreeNode<T>* root;
private:
    void insert (binTreeNode<T>*& ptr, const T& x) {
        if (ptr == NULL) {      // Base case, actual insertion
            binTreeNode<T>* newNode;
            newNode = new binTreeNode<T>(x);
            ptr = newNode;
            return;
        }
        if (x == ptr->data)
            return;
        else if (x < ptr->data)
            insert(ptr->left,x);
        else
            insert(ptr->right,x);
        return;
    }
    bool search (binTreeNode<T>* ptr, const T& x) const {
        if (ptr->data == x)
            return true;
        else if (x < ptr->data && ptr->left != NULL)
            search(ptr->left,x);
        else if (ptr->right != NULL)
            search(ptr->right,x);
        else
            return false;
    }
    binTreeNode<T>* remove (binTreeNode<T>* ptr, const T& x) {
        if (ptr == NULL)
            return NULL;
        else if (ptr->data == x && leaf(ptr)) {
            delete ptr;
            ptr = NULL;
            return ptr;
        }
        else if (ptr->data == x && !leaf(ptr))
            return ptr;
        else if (x < ptr->data) {
            ptr->left = remove(ptr->left,x);
            return ptr;
        }
        else {
            ptr->right = remove(ptr->right,x);
            return ptr;
        }
    }
    bool leaf (binTreeNode<T>* node) const {
        if (node->left != NULL || node->right != NULL)
            return false;
        return true;
    }
};

根据 valgrind,分段错误出现在我检查 if (x == ptr->data) 的条件中的私有插入中。有谁知道这是为什么?我已经完全撞墙了。谢谢:3

【问题讨论】:

  • 您确认ptr 包含有效地址吗?
  • 在此基础上进行扩展,NULL 仅在指针初始化为 NULL(或恰好具有相同的值)时才进行检查。如果我做int *ptr; ptr 可能不是 NULL,它的价值是不确定的。
  • 如果没有设置实际数据,我的构造函数会将数据设置为 NULL,因此它应该是 NULL 或有效数据。
  • 驱动函数中的 T 类型是内置类型,还是您自己的类之一?如果它是您的类之一,它是否定义了自定义 == 运算符?
  • 它们是整数,没什么特别的。

标签: c++ binary-tree binary-search-tree


【解决方案1】:

remove 代码中存在一个问题,可能是也可能不是导致崩溃的 原因,但绝对应该修复:当您递归删除 ptr-&gt;leftptr-&gt;right 时导致删除节点,您还应该将父节点中的leftright 指针设置为NULL;否则你会打开你的代码到与悬空指针相关的错误。

【讨论】:

  • 我的驱动程序甚至没有进入删除功能,所以这不是这个特殊问题,但是谢谢。
  • insert 函数也存在同样的问题。添加没有子节点的节点时,将其leftright 指针初始化为NULL
  • 我修改它设置 ptr->left 和 ptr->right 为空,它没有改变任何东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多