原题链接:
http://acm.pku.edu.cn/JudgeOnline/problem?id=1002
这道题就是让把字母串形式的电话号码转换成纯数字形式,记录这些电话号码重复的次数,最后按照电话号码的字典序从小到大输出重复两次以上的电话号码,如果没有重复的电话号码,就输出 No duplicates.
用二叉查找树很适合存储这些电话号码,最后按照中序遍历输出结果即可。
程序主要流程:
1. 对每一个输入的字符串进行转换,转换成整数形式的电话号码 A;
2. 查找二叉排序中是否有A,有,则计数器加1;没有,插入A;
3.中序遍历二叉排序树,输出结果(把整数转换字符串输出)
Version 1:
用链表形式表示二叉排序树,二叉树结点由malloc动态分配,插入算法采用递归。
复杂度:内存:3176K 耗时:719MS
Version 2: 这个版本用全局数组表示二叉树,避免动态分配内存,节省时间。插入算法还是采用递归。
复杂度:内存:1540K 耗时:594MS
version 3:
这个版本是将插入算法有递归改为循环实现,进一步加快下速度。
小结:
还可以将程序中的中序遍历改成非递归形式,再加快一下速度;另外一种用空间换时间,直接开个10000000的数组,然后在对应下标存储重复数,这个过程 比较节省时间,但是输出的时候,需要遍历比较多数组元素,比较耗时(内存:39608K 耗时:657MS)
做这道题的本意其实是想练习一下好久都没写了的c语言,并顺便再熟悉一下二叉排序树。不写不知道,写了才发现问题很多,连基本的全局变量和局部变量的作用域都能搞错,最后还得靠一步一步的debug才知道指针所指的那些树节点已经被回收了。
做v1的时候,起初把根节点指针直接传给build_tree(),以为就能构建出二叉树;实际上build_tree()里只是把root的形参指向了根节点,而root没有得到赋值,还是NULL。当时很怀疑,难道除了把root设为全局变量就没有办法了,最后用指针的指针搞定。
遇到的问题还挺多,字符串常量的指针不能改变等等,都是些基础知识。还是古人说的好,纸上得来终觉浅,以后得多多实践才知道问题所在。废话了一堆,给自己提个醒,高手当且一笑呀,O(∩_∩)O~。