算法10---二叉搜索树之基数树
基数树是用来保存和排列字符串,关于字典序有两条规则:
算法导论中给出这样的图,我们结合图来看
1. 当字符串长度相同时,从左向右逐个字符比较,左边的比右边的小。如011 < 100。
2. 字符串长度不同时,长度长的在字典序中值更大。如100 < 1011。
因此,根结点 < 左子树结点 < 右子树结点;所以我们会用到先序遍历;
我们在基数树中存储位串1011,10,011,100和0;
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 typedef struct RadixNode { 5 struct RadixNode *lchild, *rchild; 6 char *str; 7 } RadixNode; 8 9 void radix_insert(RadixNode *node, char *str) 10 { 11 int i; 12 for (i = 0; str[i] != '\0'; i++) 13 { 14 if (str[i] == '0') 15 { 16 if (node->lchild == NULL) 17 node->lchild = (RadixNode *)calloc(sizeof(RadixNode), 1); 18 node = node->lchild; 19 } 20 else 21 { 22 if (node->rchild == NULL) 23 node->rchild = (RadixNode *)calloc(sizeof(RadixNode), 1); 24 node = node->rchild; 25 } 26 } 27 node->str = str; 28 } 29 30 void radix_preorder_walk(RadixNode *node) 31 { 32 if (node != NULL) { 33 if (node->str != NULL) 34 printf("%s\n", node->str); 35 radix_preorder_walk(node->lchild); 36 radix_preorder_walk(node->rchild); 37 } 38 } 39 40 int main() 41 { 42 RadixNode *root = (RadixNode *)malloc(sizeof(RadixNode)); 43 radix_insert(root, "1011"); 44 radix_insert(root, "10"); 45 radix_insert(root, "011"); 46 radix_insert(root, "100"); 47 radix_insert(root, "0"); 48 49 radix_preorder_walk(root); 50 51 return 0; 52 }