标题:三叉树演示
只看楼主
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
得分:0 
我也没觉得三叉树比二叉树有什么优势。实现复杂度和效率优化的投入产出比不高。感觉应用的也远没有二叉树广。
2012-08-04 23:27
silent_world
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:258
专家分:1138
注 册:2011-9-24
得分:0 
回复 8楼 beyondyf
没关系,希望有人帮着点评点评,也欢迎测试下。
最近比较忙,也没有时间测试,抽了点时间,过来凑凑热闹,呵呵
2012-08-05 08:05
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:0 
回复 12楼 silent_world
呵呵,那就请多见谅了。

注释风格不统一,有点乱。

从你的代码行为看,你的三叉树是带头结点的。一般这个头结点是不动态申请的,因为没有这个必要,不管树是否为空,它总是存在的。而且动态申请会带来很多隐患,比如内存泄漏。在你的代码中,就忘了释放头结点的内存(事实上你忘了释放所有的内存)。

所以,trstrie_creat几乎没有必要。如果希望封装一下头结点的初始化过程,倒也可以留着,但只需要把mid域置NULL即可。


操作函数的头结点指针参数为什么定义为void * 型?故意躲开编译器对参数类型的检查么?在函数里又做了一次强制转换,这又何必呢?你的函数本就是个专用函数,只用来操作你定义的TERNARY_TRIE *类指针,通用指针在这里的使用只有害处没有益处。

tstrie_destroy函数的结构很怪异,感觉思路有些混乱,虽然运行上应该没什么问题,但有些判断是冗余的。

我正在改你的addData函数(存在严重的逻辑错误),可现在只改了一半就发现已经完全看不出你原来代码的样子了。呵呵,再改那就成我的代码了。我想还是你自己改一下吧。第一个循环就有问题。如果树中已有了“ABC”,再插入“AB”这个串时你的程序事实上是直接退出,并没有完成“AB”串指针加载到cur_property域的动作。

下面的函数还没看,但恐怕类似的问题还有。

这是我对你tstrie_destroy函数的修改,呵呵还能看出是你的代码么?

程序代码:
void tstrie_destroy(TERNARY_TRIE * root)
{
    TERNARY_TRIE * curNode, * delNode;
    curNode = root->child_trie[TERNARY_MIDDLE];
    root->child_trie[TERNARY_MIDDLE] = TSTRIE_NULL;
    if(curNode == TSTRIE_NULL) return;
    while(curNode != root)
    {
        if(curNode->child_trie[TERNARY_LEFT] != TSTRIE_NULL)
        {
            curNode = curNode->child_trie[TERNARY_LEFT];
            curNode->parent->child_trie[TERNARY_LEFT] = TSTRIE_NULL;
        }
        else if(curNode->child_trie[TERNARY_MIDDLE] != TSTRIE_NULL)
        {
            curNode = curNode->child_trie[TERNARY_MIDDLE];
            curNode->parent->child_trie[TERNARY_MIDDLE] = TSTRIE_NULL;
        }
        else if(curNode->child_trie[TERNARY_RIGHT] != TSTRIE_NULL)
        {
            curNode = curNode->child_trie[TERNARY_MIDDLE];
            curNode->parent->child_trie[TERNARY_MIDDLE] = TSTRIE_NULL;
        }
        else
        {
            delNode = curNode;
            curNode = curNode->parent;
            TSTRIE_DELNODE(delNode);
        }
    }
}

重剑无锋,大巧不工
2012-08-05 09:58
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
得分:0 
不释放内存这个问题估计不到工作中吃点亏是改不了了

总有那身价贱的人给作业贴回复完整的代码
2012-08-05 10:58
nanyang0226
Rank: 1
等 级:新手上路
帖 子:7
专家分:3
注 册:2012-8-3
得分:0 
学习顺便蹭分~~~~
2012-08-05 11:09
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:0 
回复 14楼 embed_xuel
嗯,这点你们做嵌入式开发的感触恐怕更深。内存少运行时间长呵呵。

重剑无锋,大巧不工
2012-08-05 11:26
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
得分:0 
回复 16楼 beyondyf
是啊,你想200毫秒执行一次的任务,每次丢四字节,设备过了半年出现了各种奇怪的问题,你说怎么定位啊,类似的还有文件句柄,用完不关闭

总有那身价贱的人给作业贴回复完整的代码
2012-08-05 11:52
随风飘荡
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:208
专家分:598
注 册:2011-9-9
得分:0 
越研究就发现这个结构越有趣,很巧妙的深度设置,不过杨大哥我还发现了一个小问题。

就是历遍树的函数,经过跟踪发现如果不先历遍中节点,又假设左子节点有内容,那么左历遍的时候str[1]已被改变那么就会影响递归中节点的str[deep1]从而影响下一层的输出
(我最怕语文了混蛋!形容的不太好,将就吧)
例:
abc
ab
aade
输出就会变成
ab
aade
aac
——————————————————————————————————————


[ 本帖最后由 随风飘荡 于 2012-8-5 16:18 编辑 ]
2012-08-05 14:23
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:0 
回复 18楼 随风飘荡
还真没明白你说的意思

把你改过的代码部分发上来看看

重剑无锋,大巧不工
2012-08-05 16:25
随风飘荡
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:208
专家分:598
注 册:2011-9-9
得分:0 

就是说在这样的情况下嗯,怎么说呢




也就是说,aade那个输出之后,接下来就是递归到mid,但是str[1]已经被aade的第二个字符'a'改变了,而递归到mid使深度加了1,从而跳过了str[1],然后abc就变成aac了

然后我想这个问题应该只要先使深度改变的那个先执行就好了


[ 本帖最后由 随风飘荡 于 2012-8-5 16:45 编辑 ]
收到的鲜花
  • beyondyf2012-08-05 17:06 送鲜花  50朵   附言:发现一处bug,50分
2012-08-05 16:42



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-374683-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.148248 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved