【问题标题】:Delete node from a C binary tree without messing it up从 C 二叉树中删除节点而不弄乱它
【发布时间】:2016-12-12 00:56:24
【问题描述】:

我是一个使用 C 二叉树库的初学者。我想知道如何从二叉树中删除一个节点而不会弄乱整个事情。这是我创建树的方法:

结构:

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

typedef struct Node TNode;
typedef struct Node *binary_tree;

树的创建:

binary_tree NewBinaryTree(int value_root) {
    binary_tree newRoot = malloc(sizeof(TNode));
    if (newRoot) {
        newRoot->value = value_root;
        newRoot->left = NULL;
        newRoot->right = NULL;
    }
    return newRoot;
}

添加元素:

void Insert(binary_tree *tree, int val) {
    if (*tree == NULL) {
        *tree = (binary_tree)malloc(sizeof(TNode));
        (*tree)->value = val;
        (*tree)->left = NULL;
        (*tree)->right = NULL;
    } else {
        if (val < (*tree)->value) {
            Insert(&(*tree)->left, val);
        } else {
            Insert(&(*tree)->right, val);
        }
    }
}

我的问题基本上是我如何删除左节点,然后“链接”链接到该左节点的其他节点(或叶子),这样树就没有空叶子?例如:如果叶子 4 有 2 个子节点(left3 和 right8),则删除叶子 4,它将子节点 left3 和 right8 链接到上节点(叶子 4 上方)。很难解释我尽我所能。

谢谢

【问题讨论】:

  • 网上有很多参考资料,告诉你在二叉搜索树中删除是如何发生的。先过一遍,或者refer here
  • 如果您还有问题,请尝试搜索答案。如果您仍然没有找到解决方案,请随时再次询问或评论堆栈溢出。编码愉快。

标签: c tree binary-tree binary-search-tree


【解决方案1】:

从 BST 中删除的算法在概念上如下所示:

  • 您使用其键搜索节点。

  • 找到节点后,检查它是否只有一个子节点。

    • 如果是这样,则删除节点并将刚刚找到的子节点放在其位置。
    • 如果没有,则在右子树中搜索具有最小值键的节点。找到后,将要删除的节点的键替换为此最小键,然后删除右子树中的最小节点。

整个概念是如何工作的,以及它在 C 代码中的表现如何,您可以阅读例如 here。我的建议是先看看这个diagram,它说明了所有可能的情况。 祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多