《算法导论》第12章 二叉查找树 (3)基数树

本文介绍了基数树的数据结构,详细解释了其与二叉查找树和Trie树的区别及相似之处,并通过C语言代码示例展示了如何使用基数树进行字符串的插入与遍历。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


基数树与二叉查找树和Trie树很相似。它像BST一样是二叉的,向左表示0而不是BST的小于,
而向右则表示1而不是大于。它像Trie一样共享相同的结点来保存字符串中相同的前缀,从而
节省了空间,但它不像Trie那样每个结点有很多孩子(可以是26个,表示a到z),它用来处理
只包含0和1的字符串。



基数树和Trie都用来保存和排列字符串,那么现在来看看字典序,关于字典序有两条规则:

1. 字符串长度相同时,从左向右逐个字符比较。如011 < 100。

2. 字符串长度不同时,长度长的在字典序中值更大。如100 < 1011。

因此,根结点 < 左子树结点 < 右子树结点。

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值