Exemplo n.º 1
0
void _trie_node_delete_path(ktrie_node_t* node, const char* s) {
    char c = 0;
    char n = 0;
    verify(node);
    verify(s);
    c = *s;
    if (node->key == c) {
        s += 1;
        n = *s;
        if (!n) {
            return;
        }
        if (node->center) {
            _trie_node_delete_path(node->center, s);
            _trie_node_destroy_self(node->center, 0);
            node->center = 0;
        }
    } else if (node->key > c) {
        if (node->left) {
            _trie_node_delete_path(node->left, s);
            _trie_node_destroy_self(node->left, 0);
            node->left = 0;
        }
    } else if (node->key < c) {
        if (node->right) {
            _trie_node_delete_path(node->right, s);
            _trie_node_destroy_self(node->right, 0);
            node->right = 0;
        }
    }
}
Exemplo n.º 2
0
int _trie_node_remove(ktrie_node_t* node, const char* s, void** value) {
    int           error      = error_ok;
    ktrie_node_t* start_node = 0;
    verify(node);
    verify(s);
    error = _trie_node_find(node, s, s, value);
    if (error_ok != error) {
        return error;
    }
    /* 减少路径引用计数 */
    if (_trie_node_decref_path(node, &start_node, s)) {
        /* 销毁路径 */
        _trie_node_delete_path(start_node, s);
        if (start_node->parent) { /* 非根节点 */
            if (start_node->parent->left == start_node) {
                start_node->parent->left = 0;
                _trie_node_destroy_self(start_node, 0);
            } else if (start_node->parent->right == start_node) {
                start_node->parent->right = 0;
                _trie_node_destroy_self(start_node, 0);
            } else if (start_node->parent->center == start_node) {
                start_node->parent->center = 0;
                _trie_node_destroy_self(start_node, 0);
            }
        } else {
            /* 根节点 */
            _trie_node_reset(start_node);
        }
    }
    return error;
}
Exemplo n.º 3
0
Arquivo: trie.c Projeto: libin581/knet
int _trie_node_remove(ktrie_node_t* node, const char* s, void** value) {
    int           error       = error_ok;
    ktrie_node_t* start_node  = 0;
    ktrie_node_t* parent_node = 0;
    verify(node);
    verify(s);
    error = _trie_node_find(node, s, s, value);
    if (error_ok != error) {
        return error;
    }
    /* 减少路径引用计数 */
    if (_trie_node_decref_path(node, &start_node, s)) {
        /* 销毁路径 */
        _trie_node_delete_path(start_node, s);
        if (_trie_node_check_orphan(start_node)) {
            _trie_node_destroy_self(start_node, 0);
        }
        start_node = 0;
    }
    if (start_node) {
        /* 使当前节点无效 */
        destroy(start_node->real_key);
        start_node->real_key = 0;
        while (start_node && _trie_node_check_orphan(start_node)) {
            parent_node = start_node->parent;
            _trie_node_destroy_self(start_node, 0);
            start_node = parent_node;
        }
    }
    return error;
}