Java中的二进制树静态方法

时间:2015-01-28 14:25:23

标签: java binary-tree binary-search-tree static-methods

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

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

3 个答案:

答案 0 :(得分:3)

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

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

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

第四个选项并不太糟糕,那就是使用访问者模式并拥有NodeVisitor界面。

答案 1 :(得分:1)

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

tree.getSize()tree.getDepth()BinaryTree.getDepth(tree)更容易阅读和理解。

然而有人可能认为方法getPreOrder()getInOrder()getPostOrder()可以是静态的,甚至可以在他们自己的类中。您可以将其视为StrategyPattern如何走树。

TraversalStrategy.PREORDER.walk(树);

可能是一个好主意,而不是添加更多方法。这样,如果您需要添加不同的方式来走到树,您不必继续向BinaryTree添加方法(遵循开放原则)

答案 2 :(得分:0)

class表示一组Object s的模式。 class可以拥有static个成员和方法,即class级别的属性和权限。类的实例是Object,它具有特定的非static成员和方法。在你的情况下,我们谈论的是一堆吸气剂。关键问题是:

  

这些方法是什么?

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