📜  三元搜索树(删除)(1)

📅  最后修改于: 2023-12-03 15:35:52.587000             🧑  作者: Mango

三元搜索树(删除)

什么是三元搜索树?

三元搜索树(TST,Ternary Search Tree)是一种数据结构,可以用于字符串查找和排序。 它是由链表和三元节点组成的树形结构,其中每个节点都有一个字符和三个指针,表示小于,等于和大于当前字符。

三元搜索树的特点
  • 节点包含3个指针,分别指向小于、等于和大于当前字符的子节点。
  • 节点可以表示完整的单词,也可以是单词的前缀。
  • 查询、插入和删除的时间复杂度为O(M + log N),其中M为查询单词的长度,N为单词数。
三元搜索树的优点
  • 比普通的字典树更节省空间,因为只有在有子节点的字符才会有子节点的指针。
  • 比哈希表有更好的空间利用率和局部性。
  • 支持按字典序排序,比平衡二叉树更快。
三元搜索树的应用
  • 字符串查找和排序
  • 自动补全和拼写检查
  • 最接近单词匹配
三元搜索树的删除操作

三元搜索树的删除操作有以下几种情况:

  1. 待删除节点是叶子节点,直接删除即可。
  2. 待删除节点只有一个子节点,将子节点替换待删除节点即可。
  3. 待删除节点有两个子节点,可以选择将它的前驱或后继节点替换它。

我们可以通过递归实现节点的删除。

struct node {
  char key;
  bool is_end;
  node *left, *mid, *right;
};

node* deleteNode(node* root, string key, int depth = 0) {
  // 空节点或者找到了待删除节点
  if (!root)
    return NULL;
  if (key[depth] < root->key)
    root->left = deleteNode(root->left, key, depth);
  else if (key[depth] > root->key)
    root->right = deleteNode(root->right, key, depth);
  else if (depth < key.length() - 1) // 删除字符串的中间节点
    root->mid = deleteNode(root->mid, key, depth + 1);
  else // 找到待删除单词
    root->is_end = false;

  // 删除空节点
  if (!root->left && !root->mid && !root->right) {
    delete root;
    root = NULL;
  }

  // 如果节点没有子节点,可以用其它子树进行替换
  if (!root->left && !root->mid) {
    node* temp = root->right;
    delete root;
    root = temp;
  } else if (!root->mid && !root->right) {
    node* temp = root->left;
    delete root;
    root = temp;
  }
  // 找到节点的前驱节点进行替换
  else {
    if (!root->mid) { // 如果当前节点没有中间节点,则找前驱节点
      node* curr = root->left;
      while (curr->right) // 在左子树中找最大的节点
        curr = curr->right;
      root->key = curr->key;
      root->is_end = curr->is_end;
      root->mid = curr->mid;
      root->left = deleteNode(root->left, string(1, curr->key), depth);
    }
    // 找到节点的后继节点进行替换
    else {
      node* curr = root->right;
      while (curr->left) // 在右子树中找最小的节点
        curr = curr->left;
      root->key = curr->key;
      root->is_end = curr->is_end;
      root->mid = curr->mid;
      root->right = deleteNode(root->right, string(1, curr->key), depth);
    }
  }

  return root;
}
总结

三元搜索树是一种非常有用的数据结构,用于字符串查找和排序。它比哈希表更节省空间,支持按字典序排序,比平衡二叉树更快。我们可以使用三元搜索树实现自动补全和拼写检查等功能。