Java 中的二叉树静态方法
Binary Tree static methods in Java
我的 Java 二叉树和搜索二叉树的实现中有这些实例方法:getSize()
、getHeight()
、getDepth()
、getPreOrder()
、 getInOrder()
、getPostOrder()
和 getLevelOrder()
。这些方法在其他具有参数 Node
的递归方法中使用树的根。从OOP的角度来看哪个更适合使用:
- 将这些递归方法作为静态方法使用,因为它们使用了一个不属于实际class的对象(
Node
),并且它们不使用任何class属性,
- 它们可以是实例方法,因为它们可以在这棵树的子树中使用,并且不使用任何静态属性,
- 或者它们可能在其他静态 class 中,例如
UtilsTree()
?
从 OOP 的角度来看,我认为方法 2 是可行的方法。 (在 OOP 中,静态通常不受欢迎。)
据我了解,该方法使用this
作为根,然后在不调用任何实例方法的情况下遍历树的其余部分?考虑到其他节点是相同的 class,这并不算太糟糕,这意味着代码已经在所有对象之间共享。 (该方法可以访问其他实例的私有成员等等。)
话虽如此,我认为 getSize
、getHeight
、getDepth
、getPreOrder
、getInOrder
、getPostOrder
和 getLevelOrder
都可以实现为适当的递归实例方法。 (如果我错了请纠正我。)
第四个不错的选择是使用访问者模式并具有 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?
答案是:方法,就是你Tree
Object
的能力。如果您有多个 Tree
,则其他 Tree
与给定 Tree
的大小和内容无关。因此,所有提到的方法都应该是 public
,实例级方法,除非你想在内部使用它们,在这种情况下,受影响的方法应该是 protected
,非 static
方法.
我的 Java 二叉树和搜索二叉树的实现中有这些实例方法:getSize()
、getHeight()
、getDepth()
、getPreOrder()
、 getInOrder()
、getPostOrder()
和 getLevelOrder()
。这些方法在其他具有参数 Node
的递归方法中使用树的根。从OOP的角度来看哪个更适合使用:
- 将这些递归方法作为静态方法使用,因为它们使用了一个不属于实际class的对象(
Node
),并且它们不使用任何class属性, - 它们可以是实例方法,因为它们可以在这棵树的子树中使用,并且不使用任何静态属性,
- 或者它们可能在其他静态 class 中,例如
UtilsTree()
?
从 OOP 的角度来看,我认为方法 2 是可行的方法。 (在 OOP 中,静态通常不受欢迎。)
据我了解,该方法使用this
作为根,然后在不调用任何实例方法的情况下遍历树的其余部分?考虑到其他节点是相同的 class,这并不算太糟糕,这意味着代码已经在所有对象之间共享。 (该方法可以访问其他实例的私有成员等等。)
话虽如此,我认为 getSize
、getHeight
、getDepth
、getPreOrder
、getInOrder
、getPostOrder
和 getLevelOrder
都可以实现为适当的递归实例方法。 (如果我错了请纠正我。)
第四个不错的选择是使用访问者模式并具有 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?
答案是:方法,就是你Tree
Object
的能力。如果您有多个 Tree
,则其他 Tree
与给定 Tree
的大小和内容无关。因此,所有提到的方法都应该是 public
,实例级方法,除非你想在内部使用它们,在这种情况下,受影响的方法应该是 protected
,非 static
方法.