本文主要是介绍《DSAA》 12.1 自顶向下伸展树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在许多应用中,当一个节点被访问后,马上就很可能再次被访问到,研究表明这种情况比人们预料的要频繁的多。所以伸展树的基本想法是:当一个节点被访问后,它就要通过一系列的旋转被放到根上。
自顶向下伸展树的搜索方式非常独特,它实际上是一个拆了又装的过程,这个过程被称为伸展:
最开始先新建两颗空树:L树和R树,用于缓存。在从原树自顶向下搜索时,每一次迭代都将父节点以上的部分拆除,视情况接到两旁的L树或R树上,直到搜索结束,这时用L树和R树接到到根上,而把根上原来的左右子树分别接到L树和R树上,处理完毕。
此时的树根就是所要寻找的节点,或者是一个最接近的节点。
值得一提的是:由于伸展树的特性,它的删除操作比其他的二叉搜索树要容易得多,因为搜索的结果使 要删除的节点挪到了根上,之后的操作很巧妙:在左子树中反过来搜索根,这样做的结果是左儿子的右子树因为旋转而消失了,于是可以把根的右子树接到左儿子上,根自然被删除。
关于自顶向下伸展树的操作,原书中给出了很简洁漂亮的实现,由上面的例子可见一斑。
以下演示是一颗树的逐节点删除过程,用的是后文红黑树用的例子,对照一下这两种树的运行也很有趣:
这篇关于《DSAA》 12.1 自顶向下伸展树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!