我的班级目前正在将二叉树作为数据结构单元的一部分。我知道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;
}
}
答案 0 :(得分:2)
是的,它应该通过encapsulating给出树的功能接口所有与内部结构相关的行为和算法。
为什么这样好? 因为您将定义一些仅提供某些功能并且以独立方式工作的内容,以便每个人都能够使用您的树类而无需关心节点,算法等等。
理想情况下,该类应该是参数化的,以便您拥有Tree<T>
,并且您将能够拥有通用方法,例如
T getRoot()
基本上你必须投射它以便它能够
答案 1 :(得分:1)
任何数据结构的目的都是为您提供一种方法来保存相关值的集合并以有意义的方式对其进行操作。
树是一种特殊的数据结构。对于分层的数据来说,这是一个很好的选择:具有自然亲子关系的数据。对于每个父节点,二叉树最多只有两个子节点。
值得特别提及的树的另一个特性是它自相似的事实:树中的每个节点本身就是子树的根。递归利用了这个事实。
是的,这些都是很好的方法。您可能希望查看其他可能有用的java.util.Map
界面。
答案 2 :(得分:1)
正如我所看到的,Tree
类应该包含对树的根节点的引用,以及对作为整体在树上运行的方法和属性的引用,而不是属于每个节点的方法,例如getLeft()
,getValue()
。
例如,我在size
类中定义了一个Tree
属性,并且向树中添加或删除节点的方法(也恰好在这个类中)将负责保持尺寸最新。
答案 3 :(得分:0)
“是否用于管理整个节点集?”
是
“它是否只包含插入,删除和搜索特定节点所需的功能?”
基本上,是的。因此,它至少应包含对根节点的引用。
答案 4 :(得分:0)
正如您所怀疑的那样,假设存在一点点缺陷。您定义的Node
类型是二叉树的完美实例。
杰克提到你希望在整个节点集周围有一个Tree
类型,以便提供getRoot
,插入,删除等操作。这当然不是一个坏主意,但绝不是一个要求。其中许多操作本身都可以进行Node
,您不一定要完成所有这些操作;例如,支持和反对有getRoot
操作的参数。反对它的一个论点是,如果你的算法在某一点上只需要一个子树,那么保留在根Tree
上的Node
对象可以防止Node
的垃圾收集你的算法不再需要了。
但更一般地说,这里需要提出的真正问题是:您正在处理的事情是接口,哪些是实现?因为如果你想将二叉树作为接口传递给调用者是一回事,而另一个如果你想提供某种有限映射作为接口,那么二叉树只是一个实现细节。在前一种情况下,客户端将“知道”树是null
或Node
具有值和分支,并且将被允许,例如,递归树的结构;在后一种情况下,客户会“知道”的是,您的班级支持某种形式的put
,get
和delete
操作,但不允许依赖于以下事实:这被存储为搜索树。在后一种情况的许多变体中,您确实会使用Tree
类型作为前端来隐藏客户端的节点。 (例如,Java的内置java.util.TreeMap
类就是这样做的。)
所以最短的答案确实取决于它。稍微长一点的答案取决于二叉树实现与其用户之间契约的内容;什么是调用者可以假设树木的内容,二叉树的哪些细节是作者希望将来能够改变的东西等等。