繁体   English   中英

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

[英]Delete node from a C binary tree without messing it up

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

我的问题基本上是如何删除例如一个左节点,然后“链接”链接到该左节点的其他节点(或叶子),从而使树没有NULL叶子? 例如:如果叶子4有2个子节点(left3和right8),则删除叶子4,将子节点left3和right8链接到上节点(在leaf4之上)。很难解释我如何尽力而为。

谢谢

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

  • 您使用其键搜索节点。

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

    • 如果存在,请删除该节点,然后将其放在刚刚找到的子节点上。
    • 如果不是,则在右侧子树中使用最小值键搜索节点。 找到它后,将您要删除的节点的键替换为此最小键,然后删除右侧子树中的最小节点。

整个概念的工作原理以及在C代码中的外观如何,例如,您可以在此处阅读。 我的建议是首先看一下该 ,该图说明了所有可能的情况。 祝好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM