📜  三元搜索树(1)

📅  最后修改于: 2023-12-03 14:48:47.017000             🧑  作者: Mango

三元搜索树

简介

三元搜索树(Ternary Search Tree)是一种特殊的字典树,能够有效地存储和查找字符串。它通过将字符串拆成三部分进行存储,分别是左侧子树、相等部分和右侧子树,并使用指针连接它们,形成一棵树状结构。在查找时,可以利用相等部分快速定位搜索的字符串是否存在于树中。

相较于普通的字典树,三元搜索树可以通过压缩存储大量的字符串,减小空间消耗。并且在查找时,平均比平衡二叉搜索树快一倍以上。

实现
节点结构

为了构建三元搜索树,我们需要一个节点结构来描述每个节点。它包含三个指向左侧子节点、相等部分子节点和右侧子节点的指针,以及一个存储字符的属性值。

class Node {
public:
    char val;        // 存储的字符
    Node* left;      // 左侧子节点
    Node* eq;        // 相等部分子节点
    Node* right;     // 右侧子节点

    Node(char c) : val(c), left(nullptr), eq(nullptr), right(nullptr) {}
};
插入操作

在三元搜索树中插入字符串需要遍历树的节点,找到合适的位置插入节点。我们可以使用递归来实现这一过程。

void insert(Node*& root, std::string str, int i) {
    if (!root) {
        root = new Node(str[i]);
    }

    if (str[i] < root->val) {
        insert(root->left, str, i);
    } else if (str[i] > root->val) {
        insert(root->right, str, i);
    } else {
        if (i < str.length() - 1) {
            insert(root->eq, str, i + 1);
        }
    }
}
查找操作

查找在三元搜索树中的字符串,需要按照某种规则遍历树,并利用相等部分快速定位搜索的字符串是否存在于树中。

bool search(Node*& root, std::string str, int i) {
    if (!root) {
        return false;
    }

    if (str[i] < root->val) {
        return search(root->left, str, i);
    } else if (str[i] > root->val) {
        return search(root->right, str, i);
    } else {
        if (i == str.length() - 1) {
            return true;
        } else {
            return search(root->eq, str, i + 1);
        }
    }
}
总结

三元搜索树在空间和时间效率上都有比较优秀的表现,但是相较于哈希表,它在查找效率上仍有较大差距,因为哈希表可以通过哈希函数一步到位地查找。不过,三元搜索树不仅仅可以用于字符串的存储和查找,在其他需要存储序列的场景中,也可以发挥自身优势。