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