删除一个二叉搜索树节点

删除一个二叉搜索树节点到底哪里出问题了

#include<stdio.h>
#include<stdlib.h>

struct Node {
    int data;
    Node* left;
    Node* right;
};

struct Node* FindMin(Node* root)
{
    if (root->left != NULL)
        FindMin(root->left);
    else
        return root;
}

struct Node* Delete(Node* root, int data)
{
    if (root == NULL)
        return root;
    else if (data < root->data)
        root->left = Delete(root->left, data);
    else if (data > root->data)
        root->right = Delete(root->right, data);
    else
    {
        //Case 1: No child
        if (root->left == NULL && root->right == NULL)
        {
            struct Node* temp = root;
            root = NULL;
            free(temp);
            return root;
        }
        //Case 2: One child
        else if (root->left == NULL)
        {
            struct Node* temp = root;
            root = root->right;
            free(temp);
            return root;
        }
        else if (root->right == NULL)
        {
            struct Node* temp = root;
            root = root->left;
            free(temp);
            return root;
        }
        //Case 3: Two child
        else
        {
            struct Node* temp = FindMin(root->right);
            root->data = temp->data;
            root->right = Delete(root->right,temp->data);
            return root;
        }
    }
}

【以下回答由 GPT 生成】

问题分析:根据提供的代码,有几个潜在的问题: 1. 在FindMin函数中没有返回值,需要在递归调用中添加return关键字,修复这个问题。 2. 在Delete函数中,没有处理root为null的情况,需要在函数的开始加入if (root == NULL) return root;的判断。

解决方案:

#include <stdio.h>
#include <stdlib.h>

struct Node {
    int data;
    Node* left;
    Node* right;
};

struct Node* FindMin(Node* root)
{
    if (root->left != NULL)
        return FindMin(root->left);
    else
        return root;
}

struct Node* Delete(Node* root, int data)
{
    if (root == NULL)
        return root;

    if (data < root->data)
        root->left = Delete(root->left, data);
    else if (data > root->data)
        root->right = Delete(root->right, data);
    else
    {
        if (root->left == NULL && root->right == NULL)
        {
            struct Node* temp = root;
            root = NULL;
            free(temp);
        }
        else if (root->left == NULL)
        {
            struct Node* temp = root;
            root = root->right;
            free(temp);
        }
        else if (root->right == NULL)
        {
            struct Node* temp = root;
            root = root->left;
            free(temp);
        }
        else
        {
            struct Node* temp = FindMin(root->right);
            root->data = temp->data;
            root->right = Delete(root->right, temp->data);
        }
    }
    return root;
}

这样修改后的代码将能正常删除二叉搜索树中的节点。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^