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; }
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; }
int trie_find(ktrie_t* trie, const char* s, void** value) { verify(trie); verify(s); verify(*s); if (value) { *value = 0; } return _trie_node_find(trie->root, s, s, value); }
int _trie_node_find(ktrie_node_t* node, const char* key, const char* s, void** value) { char c = 0; char n = 0; verify(node); verify(s); verify(key); if (!node->key) { return error_trie_not_found; } c = *s; if (node->key == c) { /* 中间节点 */ s += 1; n = *s; if (!n) { if (!node->real_key) { return error_trie_not_found; } if (strcmp(node->real_key, key)) { return error_trie_not_found; } if (value) { *value = node->value; } return error_ok; } if (node->center) { return _trie_node_find(node->center, key, s, value); } } else if (node->key > c) { /* 左边节点 */ if (node->left) { return _trie_node_find(node->left, key, s, value); } } else if (node->key < c) { /* 右边节点 */ if (node->right) { return _trie_node_find(node->right, key, s, value); } } return error_trie_not_found; }