【问题标题】:Binary Tree static methods in JavaJava中的二叉树静态方法
【发布时间】:2015-01-28 14:25:22
【问题描述】:

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

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

【问题讨论】:

  • they use an object (Node) 那么它们可以是Node的非静态方法?

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


【解决方案1】:

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

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

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

第四个不错的选择是使用访问者模式并拥有NodeVisitor 接口。

【讨论】:

  • 因此,在OOP中,做实例递归方法是否比静态递归方法更好?
  • 我认为这更可取。尽管我认为其原因更多地在于可读性和掌握代码的工作原理,而不是面向对象的原则。我的意思是在根对象的方法中遍历子树不会违反封装或任何东西。
【解决方案2】:

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

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

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

TraversalStrategy.PREORDER.walk(tree);

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

【讨论】:

  • 我认为 tree.getSize() 是获取树大小的更好方法,但是 getSize() 调用为 getSize(root) 的递归方法可以使用一个节点不像这棵树在树中。
  • 你可以让那些静态的他们不必公开
【解决方案3】:

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

这些方法是谁的?

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

【讨论】:

  • 答案是正确的,但是这些方法使用递归方法,其参数节点可以是其他树的节点。问题“这些方法是谁的?”在这种情况下不那么直观。
  • 其实就是这样。您正试图在您正在处理的树中找到一个节点。另一棵树实际上包含相同的节点是不相关的。您的方法应该是不可知的,因此,如果您稍后尝试搜索不存在于另一棵树中的节点,您的方法在逻辑上仍然是可行的。永远不要假设您当前的情况将永远适用。
  • 是的,这是正确的,但不直观,您可以使用实际实例树找到另一个实例树的节点,例如BTree Tree = new Tree(); BTree AnotherTree = new Tree(); Tree.createTree(Node); AnotherTree.createTree(NodeOfAnotherTree); Tree.getSize(NodeOfAnotherTree);
  • 我称之为巧合。在我看来,重点是我在当前 Tree 实例中搜索节点这一事实。如果这不适合您,那么您可以发明自己的策略,但要确保它与您的队友兼容,它有效且易于使用。在我看来,节点来自哪里并不相关,相关的是我们正在树中搜索节点。
  • 我认为您认为 Node 和 NodeOfAnotherTree 是相同的,但事实并非如此。递归方法遍历树,因为节点具有子属性,因此您可以通过此实际节点获取树的大小。问题是当你这样做时`Tree.getSize(NodeOfAnotherTree)你获得了AnotherTree的大小而不是Tree的大小。
猜你喜欢
  • 1970-01-01
  • 2013-07-20
  • 1970-01-01
  • 1970-01-01
  • 2016-03-13
  • 2018-10-08
  • 1970-01-01
  • 2014-03-26
  • 1970-01-01
相关资源
最近更新 更多