调试 void* 函数时出现非法指令

问题描述 投票:0回答:1

我编写了这段代码来实现 BST:

一个节点有 4 个属性:1 个 int val、1 个指向其父节点的指针、1 个指向其左子节点的指针、1 个右子节点。我写了2个方法:1个插入,1个删除。

#include <bits/stdc++.h>
using namespace std;
class Node
{
public:
    int data;
    Node *parent;
    Node *left_child;
    Node *right_child;
    Node()
    {
        data = 0;
        parent = NULL;
        left_child = NULL;
        right_child = NULL;
    }
    Node(int val)
    {
        data = val;
        parent = NULL;
        left_child = NULL;
        right_child = NULL;
    }

    static void *insert(Node *current_node, int val)
    {
        if (current_node->data == val)
        {
            cout << "Duplicate Value";
            return NULL;
        }
        if (current_node->left_child == NULL && val < current_node->data)
        {
            Node *temp_node = new Node(val);
            current_node->left_child = temp_node;
            temp_node->parent = current_node;
            return NULL;
        }
        if (current_node->right_child == NULL && val > current_node->data)
        {
            Node *temp_node = new Node(val);
            current_node->right_child = temp_node;
            temp_node->parent = current_node;
            return NULL;
        }
        if (current_node->left_child != NULL && val < current_node->data)
        {
            return insert(current_node->left_child, val);
        }
        if (current_node->right_child != NULL && val > current_node->data)
        {
            return insert(current_node->right_child, val);
        }
    };

    static void *delete_node(Node *current_node, int val)
    {
        if (current_node == NULL)
        {
            return nullptr;
        }
        else if (current_node->data == val)
        {
            if (current_node->left_child == NULL)
            {
                Node *parent_node = current_node->parent;
                if (parent_node->left_child == current_node)
                {
                    Node *right_child = current_node->right_child;
                    right_child->parent = parent_node;
                    parent_node->left_child = right_child;
                }
                else if (parent_node->right_child == current_node)
                {
                    Node *right_child = current_node->right_child;
                    right_child->parent = parent_node;
                    parent_node->right_child = right_child;
                }
            }
            else if (current_node->right_child == NULL)
            {
                Node *parent_node = current_node->parent;
                if (parent_node->left_child == current_node)
                {
                    Node *left_child = current_node->left_child;
                    left_child->parent = parent_node;
                    parent_node->left_child = left_child;
                }
                else if (parent_node->right_child == current_node)
                {
                    Node *left_child = current_node->left_child;
                    left_child->parent = parent_node;
                    parent_node->right_child = left_child;
                }
            }
        }
        else if (current_node->data > val)
        {
            delete_node(current_node->left_child, val);
        }
        else if (current_node->data < val)
        {
            delete_node(current_node->right_child, val);
        }
    };
};
int main()
{
    Node *root = new Node(4);
    Node::insert(root, 1);
    Node::insert(root, 2);
    Node::insert(root, 3);
    Node::insert(root, 5);
    Node::insert(root, 6);
    Node::delete_node(root, 10);
    Node::delete_node(root, 1);
    return 0;
}

但是当我调试时,它会在命中行时抛出异常“非法指令”

delete_node(current_node->right_child, val);

命中后返回 nullptr;

我希望删除方法将使用递归删除值为 val 的 current_node 的后代。

c++ debugging binary-search-tree
1个回答
0
投票

@463035818_is_not_an_ai 的回答: 只需声明2个方法:

static void insert()
static void delete()

因为这些函数不返回任何东西

© www.soinside.com 2019 - 2024. All rights reserved.