📘
Introduction_to_Algorithms
  • Introduction
  • 第6章:堆排序
    • 练习题
    • 思考题
      • 6-3 Young
  • 第7章:快速排序
    • 练习题
    • 思考题
      • 7-6 对区间的模糊排序
  • 第8章:线性时间排序
    • 练习题
      • 8.3-4 O(n)时间内对[0..n^-1]之间的n个数排序
    • 思考题
      • 8-3 排序不同长度的数据项
  • 第9章 排序和顺序统计学算法导论
    • 练习题
      • 9.1-1
      • 9.3-3 快速排序-最坏时间O(nlgn)
      • 9.3-6 nlgk时间求k分位数
      • 9.3-8 求两个数组的中位数
    • 思考题
      • 9-2-c-带权中位数
  • 第10章:栈和队列
    • 10.1 栈和队列
      • 练习题
      • 10.1-2 用一个数组实现两个栈
      • 10.1-5 双端队列
    • 10.2 链表
      • 练习题
      • 10.2-5 环形链表实现字典操作INSERT、DELETE、SEARCH
    • 10.3 指针和对象实现
      • 练习题
      • 10.3-4 紧凑的多重数组
    • 思考题
  • 第11章 散列表
  • [第12章]
    • [笔记和代码]
      • 12-2 基数树
  • 第14章
    • 笔记和代码
      • 14.3-6 MIN GAP
  • 第15章:动态规划
    • 练习题
    • 思考题
      • 15-2 整齐打印
      • 15-3 编辑距离
  • 第20章:斐波那契堆
    • 练习题
    • 思考题
  • ACM解题报告
    • 1043 八数码问题
    • 1053 Entropy
    • 1114 Piggy-Bank 完全背包
    • 1133 catalan数二维变种
    • 1166 敌兵布阵
    • 1281 棋盘游戏 二分匹配与增广链
    • 1394 Minimum Inversion Number
    • 1394 用线段树求逆序数
    • 1787 欧拉函数之在线算法
    • 2438 三分查找
    • 2473 Junk-Mail Filter 并查集的删除
    • 2824 欧拉公式之打表算法
    • 2855 Fibonacci Check-up 矩阵的应用
    • 2642 Stars 二维树状数组
    • 2888 二维RMQ
    • 3033 分组背包之每组至少选一
    • 3307 A^B = C mod D,已知A,C,D,求解B
    • 3465 Life is a Line 用归并排序求逆序数
    • 3483 A Very Simple Problem 数论+矩阵的应用
    • 3518 后缀数组
    • 3579 中国剩余定理(ACM/不互质的情况)
    • 后缀数组
    • B-树
    • 排序算法总结
Powered by GitBook
On this page
  • 题目
  • 代码:
  • 思考题
  1. [第12章]
  2. [笔记和代码]

12-2 基数树

Previous[笔记和代码]Next第14章

Last updated 4 years ago

题目

给定两个串a = a0a1……ap和b = b0b1……b1,其中每一个ai和每一个bj都属于某个有序字符集,如果下面两条规则之一成立,则说串a按字典序小于串b: 1)存在一个整数j,0<=j<=min(p,q),使得ai=bi,i=0,1,……,j-1,且aj<bj; 2)p<q,且ai=bi,对所有的i=0,1,……,p成立 例如,如果a和b是位串,则根据规则1)(设j=3),有10100 < 10110;根据规则2),有10100 < 101000。这与英语字典中的排序很相似。 图12-5中示出的是基数树(radix tree)数据结构,其中存储了位串1011、10、011、100和0。当查找某个关键字a = a0a1……ap时,在深度为i的一个结点处,若ai = 0则向左转;若ai = 1则向右转。设S为一组不同的二进制串构成的集合,各串的长度之和为n。说明如何利用基数树,在O(n)时间内对S按字典序排序。例如,对图12-5中每个结点的关键字,排序的输出应该是序列0、011、10、100、1011

思考:

就是字典树的一种特殊情况,字典树的模版见用指针传递的字典树 这题在以前的题目里面出现过,使用了另一种解法,见

代码:

#include <iostream>  
#include <string>  
using namespace std;  

//基数树结点结构  
struct node  
{  
    node *left;  
    node *right;  
    node *p;  
    string str;  
    node():left(NULL),right(NULL),p(NULL),str(""){}  
};  
//基数树结点  
struct Radix_Tree  
{  
    node *root;  
    Radix_Tree(){root = new node;}  
};  
//向基数树中插入一个位串  
void Insert(Radix_Tree *T, string s)  
{  
    int i;  
    node *t = T->root, *p;  
    //顺着串依次向下找  
    for(i = 0; i <s.length(); i++ )  
    {  
        //如果第i位是0,把串插入到左子树的某个位置  
        if(s[i] == '0')  
        {  
            //还没有左子树,就开辟一个  
            if(t->left == NULL)  
            {  
                p = new node;  
                p->p = t;  
                t->left = p;  
            }  
            else  
                p = t->left;  
        }  
        //如果第i位是1,把串插入到左子树的某个位置  
        else  
        {  
            //还没有左子树,就开辟一个  
            if(t->right == NULL)  
            {  
                p = new node;  
                p->p = t;  
                t->right = p;  
            }  
            else  
                p = t->right;  
        }  
        //一直找到串的最后一个字符,把串的内容存入这个节点中  
        if(i == s.length() - 1)  
            p->str = s;  
        else t = p;  
    }  
}  
//按字典序输出,其实是先序遍历的过程  
void Print(node *t)  
{  
    if(t == NULL)  
        return;  
    //如果某个节点有串的信息,就将它输出  
    if(t->str != "")  
        cout<<t->str<<endl;  
    Print(t->left);  
    Print(t->right);  
}  
int main()  
{  
    string str, x;  
    Radix_Tree *T = new Radix_Tree;  
    while(1)  
    {  
        cin>>str;  
        if(str == "I")  
        {  
            cin>>x;  
            Insert(T, x);  
        }  
        else if(str == "P")  
        {  
            Print(T->root);  
            cout<<endl;  
        }  
    }  
    return 0;  
}

思考题

算法导论 第12章 二叉查找树
算法导论-8-3-排序不同长度的数据项中的b
算法导论-12-1-具有相同关键字元素的二叉查找树
算法导论-12-2-基数树