从C二叉树中删除节点而不会弄乱它

时间:2016-12-12 00:56:24

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

我是一名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);
        }
    }
}

我的问题基本上是我可以删除一个左节点,然后&#34;链接&#34;链接到该左侧节点的其他节点(或叶子),因此树没有NULL叶子?例如:如果叶子4有2个孩子(left3和right8),那么删除叶子4,它将孩子left3和right8链接到上部节点(叶子4上面)。很难解释我试图尽我所能。

谢谢

1 个答案:

答案 0 :(得分:1)

从BST删除的算法在概念上看起来像这样:

  • 使用密钥搜索节点。

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

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

这整个概念的工作原理以及如何在C代码中查看,例如here。我的建议是首先看到这个diagram,它说明了所有可能的场景。 祝你好运!