树的遍历问题

发布时间:2023-04-06 12:57:06   来源:文档文库   
字号:
树的遍历问题【问题的提出】给定一棵树,则可以得到它的DFSBFS序列。比如:123945678BFS序列为:1,2,3,4,5,6,9,7,8DFS序列为:1,2,4,5,3,6,9,7,8所谓BFS,就是从根节点开始扩展,深度小的优先。对于同一个节点若干个儿子,编号小的优先扩展所谓DFS,就是从根节点开始扩展,深度大的优先。对于同一个节点若干个儿子,编号小的优先扩展请特别注意:同一个节点的若干儿子,编号小的优先扩展。这就是说对于一棵树,存在唯一的BFSDFS遍历序列。但是对于给定的BFSDFS序列,是不是存在唯一的树和他们对应呢?比如一棵树的BFS序列是(1,2,3,4DFS序列是(1,2,3,4那么这棵树可以是:1111222323434434有四棵不同的树可以与给定的BFS,DFS序列对应。根据这个模型,可以设计出一些问题。【构造可行解】构造性问题给定BFSDFS序列,求任意一棵原树。(或者判断无解)我们按照DFS序列的顺序来构造。很显然DFS[1]=BFS[1]=根,DFS[2]=BFS[2]=根的最小编号儿子。DFS[1]作为根,DFS[2]作为根的儿子,就构成了一棵规模为2的树。
现在假设DFS的前k-1个节点已经建好了树Tk-1。下面考虑把第k个节点DFS[k])插入到树Tk-1中构成Tkk>=3因为DFS[1],DFS[2],,DFS[k]这些点中,DFS[k]是在深度遍历中最后访问到的点,所以DFS[k]Tk中的位置必然是“极右路径”上最末段的点。也就是说Tk是通过在Tk-1的极右路径上插入DFS[k]而得到的。可以设Tk-1的极右路径是a1,a2,,at(t>=2。设DFS[k]BFS序列中的前驱v显然a1==BFS[1]。因为k>=3,所以DFS[k]DFS[2]同时DFS[2]=BFS[2]于是就有DFS[k]BFS[2]。也就是说DFS[k]BFS序列中的位置不可能是2所以vBFS[1],即va1。下面分三种情况讨论。第一种情况:存在i(2<=i,满足ai=vDFS[k]aiDFS[k]别无选择,只能给ai-1做儿子。请注意:这种情况下DFS[k]必须大于ai。因为如果DFS[k]i,根据“编号小的儿子先遍历”规则,DFS[k]ai之前就应该已经被遍历。矛盾。因此,如果在这种情况下发现DFS[k]i,就可以判定无解了。第二种情况:at=v,且at>DFS[k]错误的插入方法正确的插入方法DFS[k]atatDFS[k]从理论上说,可以有两种插入DFS[k]的方式。但是第二种方案必须满足DFS[k]>at。这显然和我们的条件矛盾。因此在第二种情况下,插入方式也是唯一的。第三种情况:at=v,且at此时有点棘手。

本文来源:https://www.2haoxitong.net/k/doc/f79c6e0d844769eae009ed54.html

《树的遍历问题.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式