Java 中的二叉树静态方法

Binary Tree static methods in Java

我的 Java 二叉树和搜索二叉树的实现中有这些实例方法:getSize()getHeight()getDepth()getPreOrder()getInOrder()getPostOrder()getLevelOrder()。这些方法在其他具有参数 Node 的递归方法中使用树的根。从OOP的角度来看哪个更适合使用:

  1. 将这些递归方法作为静态方法使用,因为它们使用了一个不属于实际class的对象(Node),并且它们不使用任何class属性,
  2. 它们可以是实例方法,因为它们可以在这棵树的子树中使用,并且不使用任何静态属性,
  3. 或者它们可能在其他静态 class 中,例如 UtilsTree()?

从 OOP 的角度来看,我认为方法 2 是可行的方法。 (在 OOP 中,静态通常不受欢迎。)

据我了解,该方法使用this作为根,然后在不调用任何实例方法的情况下遍历树的其余部分?考虑到其他节点是相同的 class,这并不算太糟糕,这意味着代码已经在所有对象之间共享。 (该方法可以访问其他实例的私有成员等等。)

话虽如此,我认为 getSizegetHeightgetDepthgetPreOrdergetInOrdergetPostOrdergetLevelOrder 都可以实现为适当的递归实例方法。 (如果我错了请纠正我。)

第四个不错的选择是使用访问者模式并具有 NodeVisitor 界面。

其中一些方法绝对应该是非静态成员,因为它们直接与特定实例相关。

tree.getSize()tree.getDepth()BinaryTree.getDepth(tree).

更容易阅读和理解

然而,有人可能会争辩说方法 getPreOrder()getInOrder()getPostOrder() 可以是静态的,甚至可以是它们自己的 class。您可以将其视为 StrategyPattern 如何行走树。

TraversalStrategy.PREORDER.walk(树);

与其添加更多方法,不如说是个好主意。这样,如果您需要添加不同的方式走到树上,您就不必继续向 BinaryTree 添加方法(遵循开闭原则)

A class 表示一组 Object 的模式。一个class可以有static个成员和方法,即class级的属性和能力。 class 的实例是 Object,它有其特定的非 static 成员和方法。在您的情况下,我们正在谈论一堆吸气剂。关键问题是:

whose are those methods?

答案是:方法,就是你TreeObject的能力。如果您有多个 Tree,则其他 Tree 与给定 Tree 的大小和内容无关。因此,所有提到的方法都应该是 public,实例级方法,除非你想在内部使用它们,在这种情况下,受影响的方法应该是 protected,非 static 方法.