滚动二叉树:Java 中常见设计模式指南 - foojay


在这篇文章中,我们介绍了一种滚动二叉树的线性算法,并用 Java 实现了它。我们依靠通用的设计模式和原则来使实现简洁灵活。

首先,我们展示了如何使用静态工厂方法来创建数据结构,例如二叉树,其语法类似于 Java Collections & Map API 中使用的语法。

然后,我们利用访问者模式实现前序、中序和后序树遍历。我们使用策略模式来实现二叉树滚动算法的顺时针和逆时针变体,并利用模板方法模式为每个变体创建可变和不可变版本。

最后,我们使用工厂模式公开滚动策略并密封底层类型以防止创建自定义策略。

滚动二叉树
二叉树是基本的数据结构,在计算机科学和软件工程中无处不在。我们用它们来表示分层数据并实现更复杂的数据结构,例如搜索树、语法树、密码哈希树、空间划分树、堆等。常见的二叉树操作包括插入、删除、旋转、遍历和查找。

一个相对不常见和未探索的操作是滚动/旋转roll (或rolling),它修改二叉树的结构,当可视化时,新获得的结构似乎以 90 度角顺时针或逆时针滚动。这为我们提供了滚动操作的两种变体——顺时针滚动(CR) 和逆时针滚动(CCR)。

滚动Rolling使二叉树的无序遍历不变,滚动二叉树产生一个新的二叉树,其无序遍历与(a)原树的后序遍历(如果顺时针滚动)相同;或者(b)原树的前序遍历(如果逆时针滚动)相同。

反过来说,原始树的无序遍历变成了(a)顺时针滚动的树的前序遍历,或者(b)逆时针滚动的树的后序遍历。

两种滚动变体是相互逆向的,也就是说,对一棵二叉树在相反的方向上连续应用两次滚动操作,总是产生原始树。而且,滚动操作是非幂等的,也就是说,在同一方向上连续应用两次不会产生原始树,但有一个单节点的树这种微不足道的情况除外。

有兴趣者点击标题

完整源码:GitHub.