编辑代码

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

// 定义树节点结构
typedef struct Node {
    int data;
    struct Node* left;
    struct Node* right;
} Node, *code;

// 创建新节点
Node* createNode(int data) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;
    newNode->left = NULL;
    newNode->right = NULL;
    return newNode;
}

// 插入节点
Node* insert(Node* root, int data) {
    if (root == NULL) {
        return createNode(data);
    }
    if (data < root->data) {
        root->left = insert(root->left, data);
    } else {
        root->right = insert(root->right, data);
    }
    return root;
}

Node* delete(Node* root, int data) {
    if (root == NULL) {
        return NULL;
    }
    if (root->data < data) {
        root->right = delete(root->right, data);
    } else if (root->data > data) {
        root->left = delete(root->left, data);
    } else {
        Node* q, *s;
        if (root->left == NULL) {
            q = root; 
            root = root->right;
            free(q);
        } else if (root->right == NULL) {
            q = root; 
            root = root->left;
            free(q);
        } else {
            // 从右子树中查找最小值
            q = root;
            s = root->right; // 从右子树开始
            while (s->left != NULL) { // 查找最小值
                q = s; 
                s = s->left;
            } 
            root->data = s->data; // 用最小值替代当前节点
            if (q != root) {
                q->left = s->right; // 更新父节点的指针
            } else {
                q->right = s->right; // 更新父节点的指针
            }
            free(s);
        }
    }
    return root; // 确保返回更新后的根节点
}

// 中序遍历
void inorder(Node* root) {
    if (root != NULL) {
        inorder(root->left);
        printf("%d ", root->data);
        inorder(root->right);
    }
}

// 主函数
int main() {
    code root = NULL;
    root = insert(root, 50);
    insert(root, 30);
    insert(root, 20);
    insert(root, 70);
    insert(root, 60);
    insert(root, 80);
    insert(root, 90);

    printf("中序遍历: ");
    inorder(root);
    printf("\n");

    root = delete(root, 50); // 更新根节点

    printf("中序遍历: ");
    inorder(root);
    printf("\n");

    return 0;
}