标题:上次二叉树统计单词有个疑问
只看楼主
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
结帖率:97.5%
 问题点数:0 回复次数:8 
上次二叉树统计单词有个疑问
程序代码:
void treeprint(struct tnode *p)
{
    if (p != NULL) {
        treeprint(p->right);
        printf("%4d %s\n", p->count, p->word);
        treeprint(p->left);
    }
}


这是二叉树中序遍历输出函数。

简单来说二叉树中序遍历为啥是先递归的右树,然后根,然后左树。
测试数据:    now is the tiome for all good men to come to the aid of their party

左树遍历完:men->is->good->for->com->all->aid(这里aid的左右叶节点为NULL)
root      : now
右树遍历完: of->party->the->their->time->to(这里to的左右节点为NULL)
当左树不满足条件,触发递归:aid->all->...->now, 然后根->now,然后右树触发->of->...->to。

左树先触发:aid->all->com->for->good->is->men->now->of->party->the->their->time->to

但是我昨天编译的时候是先触发的右树,而且结果才是正确的二叉树中序遍历。不明白为什么是先触发右树,而不是先左树达到触发条件递归:

右树先触发:to->time->their->the->party->of->new->men->is->good->for->com->all->aid
二叉树统计单词:https://bbs.bccn.net/thread-477096-1-1.html

[此贴子已经被作者于2017-5-20 09:30编辑过]

搜索更多相关主题的帖子: 二叉树 count 单词 统计 
2017-05-20 09:02
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
得分:0 
原谅我sb了, 居然可以把输出倒着看。
2017-05-20 10:11
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
先右后左,那就是降序呗。
先左后右,那就是升序。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-20 11:11
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
回复 3楼 renkejun1942
你在某贴不是说这样会破坏二叉树的结构了么~~~当然遍历输出是没有问题的~

[此贴子已经被作者于2017-5-20 11:40编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-20 11:38
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
回复 4楼 九转星河
我在那个帖子里说了啊,除了遍历。
你需要再回顾下我的那个帖子。

我说的破坏特性,主要表现在,查找和插入。

关于查找,你可以尝试想象对未排序的数组使用折半查找。
或者对降序排序的数组使用折半查找——这一点,查找函数的代码就需要改变。

https://bbs.bccn.net/thread-476865-4-1.html
37楼

PS:遍历为什么会破坏二叉树的特性?我不明白。

[此贴子已经被作者于2017-5-20 11:51编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-20 11:42
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
回复 4楼 九转星河
而且,如果二叉树的特性被破坏,中序遍历,打印出来的值,是否还会是升序或降序?

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-20 11:46
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
回复 5楼 renkejun1942
当时没有怎么细看~其实如果是只读状态就不会造成影响~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-20 12:01
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
回复 7楼 九转星河
错误的比较函数会造成二叉树的特性被破坏,因此如果二叉树的特性被破坏,造成的影响从查找到插入,甚至是遍历,主要是中序遍历得到的结果将不再是升序或降序。

例如,比较函数永远返回1,或者永远返回0。这会怎么样?我想已经不需要实际写一发代码来测试下了。

说正常一点,比较函数的写反了。例如 com(int a, int b )
正常来说,应该是 return a - b;
但是写反了,写成了 return b - a; 会怎么样呢?

你的想法是:所有人都是理智的,都知道自己在做什么,以及为什么要这样做。
然而理想很丰满,现实很骨感,现实世界中知道自己在做什么的人,并不多。

[此贴子已经被作者于2017-5-20 12:09编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-20 12:03
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
我想起一个好玩的:Windows 认为,用户不知道自己想要什么,也不知道自己在做什么,更加不打算为自己所做的一切负责。


[此贴子已经被作者于2017-5-20 12:12编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-20 12:11



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




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

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