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

我是一个初学者,正在研究一个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 value) { Insert(&(*tree)->left, val); } else { Insert(&(*tree)->right, val); } } } 

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

谢谢

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

  • 您使用其密钥搜索节点。

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

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

整个概念如何工作以及如何在C代码中查看,例如,您可以在此处阅读。 我的建议是首先看到这个图 ,它说明了所有可能的场景。 祝好运!