首页 > 解决方案 > 这个从 BST 中删除节点的函数有什么问题?

问题描述

我只是想从 BST 中删除一个节点,这给了我一个新的未定义的错误。ADT 是这样的:

typedef struct BSTNode *BSTree;
struct BSTNode {
    int value;
    BSTree left;
    BSTree right;
};

 BSTree Delete(BSTree t, int item) {
        if (item < t->value) {
            t->left = Delete(t->left, item);
        } else if (item > t->value) {
            t->right = Delete(t->right, item);
        } else {
            // deleting item
            if (t->left == NULL && t->right == NULL) {
                BSTree new = NULL;
            } else if (t->left == NULL) {
                BSTree new = t->right;
            } else if (t->right == NULL) {
                BSTree new = t->left;
           // } else {
                //BSTree new = joinTrees(t->left, t->right);
            }

            free(t);
            t = new;
        }

标签: cbinary-search-tree

解决方案


问题是您声明了仅存在于每个包含条件块中的多个变量。在函数顶部或else块顶部声明变量。然后在每个条件代码块中设置相同的变量。

BSTree Delete(BSTree t, int item) {
    BSTree new_item;
    if (item < t->value) {
        t->left = Delete(t->left, item);
    } else if (item > t->value) {
        t->right = Delete(t->right, item);
    } else {
        // deleting item
        if (t->left == NULL && t->right == NULL) {
            new_item = NULL;
        } else if (t->left == NULL) {
            new_item = t->right;
        } else if (t->right == NULL) {
            new_item = t->left;
       // } else {
            //BSTree new = joinTrees(t->left, t->right);
        }

        free(t);
        t = new_item;
    }

推荐阅读