繁体   English   中英

树抽象数据类型

[英]Tree Abstract Data Type

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

现在,我将树定义为tree(值,树,树)或Nil,我不知道如何定义addNode(值,树)的代数。

每个级别都变得越来越复杂,而且,我想不起来想一次扫描一个级别,因为从现在开始大约一个小时就一直在尝试。 当我们从树上下来时,代数只是分支成越来越多的if-eles。 我做对了吗? 你能为我指出正确的方向吗? 还是不能将树实现为树(值,树,树)?

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

编辑1:我签出了Wikipedia,但我不想使用教科书给出明确的答案,我只是想向正确的方向提供提示,无论我的方法是正确的还是将树定义为完全不可行树(值,树,树)。 我知道您可以以列表形式表示树型ADT。 但我想真正考虑一下。 希望有道理。 非常感谢你们!

编辑2:嗯,很难在互联网上解释。 假设我正在定义一个名为“ tree”的新数据结构。 我可以用自己想要的任何方式定义它,并且它的行为必须像平衡的二叉树(尽管父母和孩子的值无关紧要),所以我将其定义为tree:tree(value,tree,tree)OR nil这不是编程代码,这就是我的定义方式。 Tree是一个值+ 2个其他树,或者Tree是nil。 现在,addNode(value,tree)将一个节点添加到树中,同时保持其平衡。 这不是编程代码,而只是代数语义。 我不知道我能否正确解释。 但是我找到了一个可以使用队列或堆栈实现的解决方案,但这是我必须定义的另一个ADT,这是无效的。

编辑3:好像我已经做了很多事情,使问题变得比原本想的要难。 首先,根据我给的小解释,Gamecat的答案是完美的。 但是我同意这些意见,包括其他ADT是完全正确的。 实际上,当我们构建使用Int的任何东西时,我们都在对该结构使用ADT。 我认为每个ADT都必须是唯一的。 无论如何,非常感谢你们的回答!

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

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

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

这是一个很难的问题,因为它很模糊。 我假设您有一本教科书或类似的东西作为您课程材料的一部分。 即使这样,感觉您遇到的许多问题似乎都是由基本资源来解释的,例如二进制树上的Wikipedia条目

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM