二叉排序树求解pku 1002

原题链接:

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~。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值