【问题标题】:What should a Tree class contain?Tree 类应该包含什么?
【发布时间】:2012-04-10 06:27:00
【问题描述】:

我的班级目前正在将二叉树作为我们数据结构单元的一部分。我知道 Node 类的构造函数中必须有 3 个参数(值、左节点、右节点)。作为要求的一部分,我们必须有一个 Tree 类。树类的目的是什么?是为了管理整个节点集吗?它是否仅包含插入、删除和搜索特定节点所需的功能?

提前谢谢你。

我的节点类:

class Node {
protected int data;
protected leftNode;
protected rightNode;

Node (int data, Node leftNode, Node rightNode){
this.data = data;
this.leftNode = leftNode;
this.rightNode = rightNode;
}
}

【问题讨论】:

  • 有意使用受保护的变量。为了减小帖子的大小,我删除了 getter 和 setter。

标签: java binary-tree


【解决方案1】:

是的,应该是通过encapsulating给Tree的功能接口所有与内部结构相关的行为和算法。

为什么这样好? 因为您将定义一些只提供一些功能并且以独立方式工作的东西,这样每个人都应该能够使用您的树类,而无需关心节点、算法等。

理想情况下,该类应该是参数化的,这样您就可以拥有 Tree<T> 并且您将能够拥有通用方法,例如

T getRoot()

基本上,您必须对其进行投影,以便它允许您进行

  • 插入值
  • 删除值
  • 搜索值
  • 访问整棵树
  • 随便

【讨论】:

    【解决方案2】:

    在我看来,Tree 类应该包含对树的根节点的引用,以及对整个树上操作的方法和属性的引用,而不是属于每个节点的方法,例如getLeft(), getValue().

    例如,我会在 Tree 类中定义一个 size 属性,并且向树添加或删除节点的方法(也恰好在此类中)将负责保持大小是最新的。

    【讨论】:

      【解决方案3】:

      任何数据结构的目的都是为您提供一种方法来保存相关值的集合并以有意义的方式操作它们。

      树是一种特殊的数据结构。对于分层数据:具有自然父子关系的数据,这是一个不错的选择。二叉树的每个父节点最多有两个子节点。

      树的另一个值得特别提及的特性是它是自相似的:树中的每个节点本身就是子树的根。递归利用了这个事实。

      是的,这些都是很好的开始方法。您可能想查看java.util.Map 界面以了解其他可能有用的信息。

      【讨论】:

        【解决方案4】:

        正如您所怀疑的那样,这个假设有点缺陷。您定义的Node 类型是二叉树的完美实例。

        Jack 提到您希望在整个节点集周围有一个Tree 类型,以便提供getRoot、插入、删除等操作。这当然不是一个坏主意,但绝不是要求。许多这些操作可以继续Node 本身,您不一定必须拥有所有这些操作;例如,有支持和反对 getRoot 操作的论据。反对它的一个论点是,如果您的算法在某一时刻只需要一个子树,那么保持根 NodeTree 对象会阻止您的算法不再需要的 Nodes 的垃圾收集。

        但更一般地说,这里需要问的真正问题是:您正在处理的哪些事情是接口,哪些是实现?因为如果您想将二叉树作为接口公开给调用者是一回事,如果您想提供某种有限映射作为接口则是另一回事,而二叉树只是一个实现细节。在前一种情况下,客户端将“知道”一棵树是 null 或带有值和分支的 Node,并且将允许例如递归树的结构;在后一种情况下,客户所“知道”的只是你的类支持某种形式的putgetdelete 操作,但不允许依赖它作为搜索存储的事实树。在后一种情况的许多变体中,您确实会使用Tree 类型作为前端来对客户端隐藏节点。 (例如,Java 的内置 java.util.TreeMap 类就是这样做的。)

        所以最短的答案是,真的,这取决于。稍微长一点的答案是它取决于二叉树实现和它的用户之间的合约是什么;调用者允许对树进行哪些假设,二叉树的哪些细节是作者希望将来能够更改的内容,等等。

        【讨论】:

          【解决方案5】:

          “是用来管理整套节点的吗?”

          是的。

          “它是否仅包含插入、删除和搜索特定节点所需的功能?”

          基本上,是的。因此,它应该至少包含对根节点的引用。

          【讨论】:

            猜你喜欢
            • 2011-08-18
            • 2015-09-13
            • 2012-05-26
            • 2016-06-23
            • 1970-01-01
            • 2018-12-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多