作者rrosymoon (紫月)
看板C_and_CPP
标题Re: [问题] 二元树的追踪
时间Thu May 14 19:01:41 2009
※ 引述《rrosymoon (紫月)》之铭言:
: 请问一下二元树的追踪法,有没有比较推荐的书本或是网页
: 的教学可以看呢?
: 我借的三本资料结构的书,除了前序追踪是从树根开始往左
: 走之外,其他的都看不懂他的追踪过程,感觉跳来跳去的好
: 难懂..QQ
: 先谢谢大家了~:)
自回..
在第五本书(Borland C++入门与应用彻底剖析)里找到了比较好的
解释..(▔▽▔")
前序列印(DLR-->树根 左节点 右节点):
每个节点皆会比他的左边子节点及右边子节点先列印,而左边
子节点又比右边子节点有更高优先顺序。
中序列印(LDR):
就是列印树状结构,且以从小到大的方式列印。
後序列印(LRD):
就是在列印其某个节点前,一定要先印他的左节点,然後右节
点,等到两个子节点印完後,才列印此节点。
换个方式来说明,就是..DLR要先印出D,再印出L,如果L还有子
节点,就再往下移动,直到L下的所有子节点都印完,子节点的列
印也是照DLR的优先顺序来印。L印完後,才印D的R,列印顺序同
前面。
EX:(前序列印 DLR)
7
/ \
4 9
/ \ / \
3 6 8 12
/ / \
5 10 13
\
11
按照DLR的优先顺序,要先印出7,然後往它的左节点4移动,此时
把4看成新的根(子节点的根),按照DLR的规定,所以印出4,再
往4的左节点3移动,把它当成新的根,因此印出3。因为3底下没
有子节点了,所以往上一层移动,回到4。
4往右边有子节点6,移动到6,印出6,再往左下移动到5,印出5。
到此,7左边的节点全部都印完了,所以改移动到右边的节点9。
印出9,往左节点8移动,印出8,底下已无节点,回到上一层9。
往9右边的节点12移动,印出12,再往左节点10移动,印出10。
因为10底下还有右边的节点,所以往右边节点11移动,印出11。
到此10底下的节点都印完,回到上一层12。
12有右边节点13,所以往13移动,印出13。
因此,最後的结果为 7 4 3 6 5 9 8 12 10 11 13
EX:(中序列印 LDR)
7
/ \
4 9
/ \ / \
3 6 8 12
/ / \
5 10 13
\
11
类似DLR的原理,要印树根7之前,要先印出左节点4,移动到4
,此时4变为新的树根,要印4之前,要先印出左节点3,所以移
动到3,此时底下已无节点,所以印出3,回到上一层4。
按照LDR的顺序,节点4的L已经印完,再来是印树根的部份,所
以直接印出4,接下来移动到右节点6,把6当新的树根(D),有左
节点5,因此先印5,才印6。
此时7左边的节点都处理完,所以回到7,印出7。
再来往9移动,印出8,再印9,往右移到12,移到10,印出10,
印出11,返回到12,印出12,最後印出13。
所以结果是..3 4 5 6 7 8 9 10 11 12 13
不用特别排序,印出来的结果就有排序的效果,满神奇的~^_^
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.133.117.77
1F:→ james732:话说回来 我觉得三种追踪的递回写法很漂亮...XDD 05/14 19:03
※ 编辑: rrosymoon 来自: 220.133.117.77 (05/14 19:16)
2F:推 p0918311874:recursive 写真的很短XDD 几单扼要 好懂XDD 05/14 19:32
3F:→ netsphere:要有排序效果限定定在 BST 下 05/14 19:35
4F:→ MOONRAKER:对,排序的是树,不是traversing. 05/14 20:09