《算法导论》第12章 二叉查找树 (3)基数树(转)
2013-06-07 23:20
239 查看
基数树与二叉查找树和Trie树很相似。它像BST一样是二叉的,向左表示0而不是BST的小于,
而向右则表示1而不是大于。它像Trie一样共享相同的结点来保存字符串中相同的前缀,从而
节省了空间,但它不像Trie那样每个结点有很多孩子(可以是26个,表示a到z),它用来处理
只包含0和1的字符串。
基数树和Trie都用来保存和排列字符串,那么现在来看看字典序,关于字典序有两条规则:
1. 字符串长度相同时,从左向右逐个字符比较。如011 < 100。
2. 字符串长度不同时,长度长的在字典序中值更大。如100 < 1011。
因此,根结点 < 左子树结点 < 右子树结点。
[cpp]
view plaincopyprint?
#include <stdio.h>
#include <stdlib.h>
typedef struct RadixNode {
struct RadixNode *lchild, *rchild;
char *str;
} RadixNode;
void radix_insert(RadixNode *node, char *str)
{
int i;
for (i = 0; str[i] != '\0'; i++) {
if (str[i] == '0') {
if (node->lchild == NULL)
node->lchild = calloc(sizeof(RadixNode), 1);
node = node->lchild;
}
else {
if (node->rchild == NULL)
node->rchild = calloc(sizeof(RadixNode), 1);
node = node->rchild;
}
}
node->str = str;
}
void radix_preorder_walk(RadixNode *node)
{
if (node != NULL) {
if (node->str != NULL)
printf("%s\n", node->str);
radix_preorder_walk(node->lchild);
radix_preorder_walk(node->rchild);
}
}
int main(void)
{
RadixNode *root = malloc(sizeof(RadixNode));
radix_insert(root, "1011");
radix_insert(root, "10");
radix_insert(root, "011");
radix_insert(root, "100");
radix_insert(root, "0");
radix_preorder_walk(root);
return 1;
}
而向右则表示1而不是大于。它像Trie一样共享相同的结点来保存字符串中相同的前缀,从而
节省了空间,但它不像Trie那样每个结点有很多孩子(可以是26个,表示a到z),它用来处理
只包含0和1的字符串。
基数树和Trie都用来保存和排列字符串,那么现在来看看字典序,关于字典序有两条规则:
1. 字符串长度相同时,从左向右逐个字符比较。如011 < 100。
2. 字符串长度不同时,长度长的在字典序中值更大。如100 < 1011。
因此,根结点 < 左子树结点 < 右子树结点。
[cpp]
view plaincopyprint?
#include <stdio.h>
#include <stdlib.h>
typedef struct RadixNode {
struct RadixNode *lchild, *rchild;
char *str;
} RadixNode;
void radix_insert(RadixNode *node, char *str)
{
int i;
for (i = 0; str[i] != '\0'; i++) {
if (str[i] == '0') {
if (node->lchild == NULL)
node->lchild = calloc(sizeof(RadixNode), 1);
node = node->lchild;
}
else {
if (node->rchild == NULL)
node->rchild = calloc(sizeof(RadixNode), 1);
node = node->rchild;
}
}
node->str = str;
}
void radix_preorder_walk(RadixNode *node)
{
if (node != NULL) {
if (node->str != NULL)
printf("%s\n", node->str);
radix_preorder_walk(node->lchild);
radix_preorder_walk(node->rchild);
}
}
int main(void)
{
RadixNode *root = malloc(sizeof(RadixNode));
radix_insert(root, "1011");
radix_insert(root, "10");
radix_insert(root, "011");
radix_insert(root, "100");
radix_insert(root, "0");
radix_preorder_walk(root);
return 1;
}
相关文章推荐
- 《算法导论》第12章 二叉查找树 (3)基数树
- 《算法导论》第12章 二叉查找树 (3)基数树
- 《算法导论》第12章 二叉查找树 (3)基数树
- 《算法导论》第12章 二叉查找树 (3)基数树
- 算法导论 第12章 12-2 基数树
- 《算法导论》笔记 第12章 *12.4 随机构造的二叉查找树
- 《算法导论》第12章 二叉查找树 (1)遍历
- 《算法导论》笔记 第12章 *12.4 随机构造的二叉查找树
- 《算法导论》第12章 二叉查找树 (1)遍历
- 算法导论--第12章【二叉查找树】
- 算法导论代码 第12章 二叉查找树
- 《算法导论》第12章 二叉查找树 (1)遍历
- 算法导论 第12章 二叉查找树
- 算法导论 第12章 二叉查找树
- 《算法导论》第12章 二叉查找树 (1)遍历
- 《算法导论》读书笔记之第12章 二叉查找树
- 《算法导论》笔记 第12章 12.1 二叉查找树
- 《算法导论》第12章 二叉查找树 (2)查找、插入与删除
- 《算法导论》笔记 第12章 12.1 二叉查找树
- 《算法导论》读书笔记之第12章 二叉查找树