树抽象数据类型

时间:2009-03-12 10:03:00

标签: tree binary-tree abstract-data-type

我正在做一个名为数据结构和算法的单元。我们刚刚开始,我的教授刚刚告诉我们代数语义学的基础知识和公理是什么等等。到目前为止,我只是以阵列的形式使用了树。不使用预先排序的树的签名作为树(值,树,树),其中value是节点中的值,左节点是第一个树,右节点是第二个树。

现在我将树定义为树(值,树,树)或Nil,我无法弄清楚如何为addNode(value,tree)定义代数。

每个关卡都变得越来越复杂,另外,我无法想象一次扫描一个级别,现在已经尝试了一个小时。当我们沿着树走下去时,代数只会分支到越来越多的if-elses。我做得对吗?你能为我指出正确的方向吗?或者树不能实现为树(值,树,树)?

这是我教程的一部分(在其他问题中不值得任何分数),但我不是在寻找即时答案,我喜欢这个主题,并且想要了解更多。

编辑1:我检查了维基百科,我不想使用教科书来获得明确的答案,我只是在寻找正确方向的暗示,无论我的方法是正确还是完全无法定义树作为树(价值,树,树)。我知道你可以在列表中表示树ADT。但我想真的想一想。希望它有意义。非常感谢你们!

编辑2:嗯,很难通过互联网解释。假设我正在定义一个名为“tree”的新数据结构。我可以按照我想要的方式定义它,它必须表现得像一个平衡的二叉树(尽管父母和孩子的价值不重要) 所以我把它定义为树:树(值,树,树)或零 它不是编程代码,而是我如何定义代码。树是一个值+ 2其他树或树是零。现在addNode(value,tree)将一个节点添加到树中,同时仍保持平衡。 它不是编程代码,它只是代数语义。我不知道我是否可以正确解释。但是我得到了一个我可以使用Queues或Stacks实现的解决方案,但这是我必须定义的另一个ADT,这是无效的。

编辑3:似乎我已经假设许多事情使问题比实际应该更难。首先,从我给出的小解释,Gamecat的答案是完美的。但我同意这些意见,包含其他ADT是完全有效的。事实上,当我们构建使用Int的任何东西时,我们正在为该结构使用ADT。我认为每个ADT必须是独一无二的。无论如何,非常感谢你们的答案!

2 个答案:

答案 0 :(得分:2)

如果要将节点添加到树中,可以使用递归函数。

我认为树是有序的。所以你应该得到这样的东西:

AddNode(value, tree)

if tree is empty, create a new tree with value as node and no subtrees.
if value lesser than the treenode, call AddNode on the left branch.
else call AddNode on the right branch. (if duplicates are allowed).

如果更改了子树,请务必更新!

您可以通过以下方式将其转换为非递归函数:

if tree is empty, return a new tree with value as node and no subtrees.
if value is lesser than treenode, and there is no left subtree, create a new left subtree with value as node and no subtrees.
if value is lesser that treenode, and there is a left subtree, try again with the left subtree.
if value is greater or equal than treenode, and there is no right subtree, create a new right subtree with value as node and no subtrees.
if value is greater or equal than treenode, and there is a right subtree, try again with the right subtree.

如果树需要平衡。您需要存储获得平衡权重(可以是-1,0或1)。如果您需要在“重型”站点上添加节点,则需要对其进行重新调整。例如,如果左侧有一个节点多于右侧,则需要在左侧添加一个节点。您需要从左子树获取具有最高值的节点,并将其提升到当前顶部。前一个顶部添加到右侧子树。一定要保持子树平衡。

示例:添加节点0,1,2,3,4

Add(0)           0

Add(1)           0
                  \
                   1

Add(2)           0 (2)  =>      1 (2) =>  1
                  \            /         / \
                   1          0         0   2

Add(3)           1
                / \
               0   2
                    \ 
                     3

Add(4)           1 (4)     => 2 (4)  =>      2
                / \          / \            / \
               0   2        1   3          1   3
                    \      /              /     \
                     3    0              0       4

答案 1 :(得分:1)

这是一个很难回答的问题,因为它太模糊了。我假设你有一本课本或类似课程材料的一部分。即便如此,感觉很多你遇到问题的东西都是由基本资源解释的,例如the Wikipedia entry on 二叉树。

此页面描述了如何进行各种树遍历以及如何表示树。