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; } } }
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; }
void _trie_node_destroy(ktrie_node_t* node, knet_trie_dtor_t dtor) { verify(node); if (node->left) { _trie_node_destroy(node->left, dtor); } if (node->center) { _trie_node_destroy(node->center, dtor); } if (node->right) { _trie_node_destroy(node->right, dtor); } _trie_node_destroy_self(node, dtor); }