NOI2008 冬令营论文 数据结构的提炼与压缩
共 52 页--第 9 页
对于每个已知的串 s,我们把它任意(实际上不是任意的)分成左右两部分,
左串存储在 left tree 中,右串存储在 right tree 中。这样,我们只需要四个量:
left_root, left_leave, right_root, right_leave,就可以描述 s:s 就由 left tree 中
left_leave 到 left_root 的路径代表的串,与 right tree 中 right_root 到 right_leave
的路径代表的串组成。
下面给出一个 left-right tree 的例子(见图 1)
同时,我们允许,左串和右串中任意一串为空,甚至都为空,这时实际 s 就
为空。并规定:若在左树中的串为空,则 left_root=0;同样若在右树中的串为空,
则 right_root=0。
有了这样的数据结构,各个操作的实现已经不难了,只要实现好下面几个情
况即可:
(i) 已知树中某链的两端点,求底部端点的父亲
(ii) 已知树中某链的两端点,求顶部端点在链中的儿子
这些看起来都是 Trie 的基本操作,但由于本题中 Trie 的元素的规模不受限
制,故(ii)的实现并不平凡,因此仍需要探讨,关于树形结构的化简将在第二部
left_leave left_root right_root right_leave
图 1 整数串(5,2,1,7,8)在一棵 left-right tree 中的表示