我编写了这段代码来实现 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 的后代。
@463035818_is_not_an_ai 的回答: 只需声明2个方法:
static void insert()
static void delete()
因为这些函数不返回任何东西