我正在将二叉搜索树的函数放在一起,然后撞到了墙上。我正在处理需要从树中删除持有指定值的节点时可能遇到的每种情况。如果节点没有左右子节点,我不确定如何处理释放节点。该函数必须返回一个节点。我是否备份,检查每个左右孩子,并在孩子的时候删除价值?但是,如果该值在根目录中,我不会在如何删除它方面遇到类似的问题吗?只是作为解释,程序使用 void 指针,然后将 TYPE val 转换为单独的函数 compare(),该函数计算两个值并返回 -1 表示 <,0 表示 ==,1 表示 >。
struct Node *_removeNode(struct Node *cur, TYPE val)
{
if (compare(cur->val, val) == 0) { //if val == cur->val
if (cur->right != NULL && cur->left != NULL) { //if cur has right and left
cur = _leftMost(cur->right);
free(_leftMost(cur->right));
}
else if (cur->right == NULL && cur->left != NULL) { //if cur has left
cur = cur->left;
free(cur->left);
}
else if (cur->right != NULL && cur->left == NULL){ //if cur has right
cur = cur->right;
free(cur->right);
}
else if (cur->right == NULL && cur->left == NULL){ //if cur has no child
//free cur if cur = val
}
}
else if (compare(cur->val, val) == -1) {
cur->right = _removeNode(cur->right, val);
}
else if (compare(cur->val, val) == 1) {
cur->left = _removeNode(cur->left, val);
}
return cur;
}