Tree 树抽象数据类型

Tree 树抽象数据类型,tree,binary-tree,abstract-data-type,Tree,Binary Tree,Abstract Data Type,我正在做一个叫做数据结构和算法的单元。我们刚刚开始,我的教授刚刚教了我们代数语义学和公理等的基础知识。到目前为止,我只使用了数组形式的树。不将预排序树的签名用作树(值、树、树),其中值是节点中的值,左节点是第一棵树,右节点是第二棵树 现在我将树定义为tree(value,tree,tree)或Nil,我不知道如何定义addNode(value,tree)的代数 每一个关卡都变得越来越复杂,而且,我不可能一次扫描一个关卡,从一个小时以来一直在尝试。当我们沿着这棵树往下走的时候,代数分支成了越来越多

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

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

每一个关卡都变得越来越复杂,而且,我不可能一次扫描一个关卡,从一个小时以来一直在尝试。当我们沿着这棵树往下走的时候,代数分支成了越来越多的分支。我做得对吗?你能给我指一下正确的方向吗?或者树不能实现为树(值、树、树)

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

编辑1:我查阅了维基百科,我不想用教科书来获得明确的答案,我只是想寻找一个指向正确方向的提示,无论我的方法是正确的还是完全不可能将树定义为树(值、树、树)。我知道你可以用列表的形式表示一棵树。但我想好好想想。希望它有意义。谢谢大家

编辑2:嗯,很难在网上解释。假设我正在定义一个名为“树”的新数据结构。我可以用我想要的任何方式来定义它,它的行为必须像一个平衡的二叉树(尽管,父母和孩子的价值并不重要) 所以我把它定义为tree:tree(value,tree,tree)或nil 这不是编程代码,而是我如何定义它。树是一个值+2其他树或树为零。现在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

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

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

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

我不清楚问题出在哪里。如果您更具体一些,它会有所帮助:addNode必须做什么(作为根添加值?保持平衡?)以及您现在是如何做的(例如,什么公理)?我现在唯一能说的是,表示法很好(除了使用“树”作为函数和类型)。不清楚的是你被困在哪里了。你能举个例子说明你到目前为止取得了什么成果吗?如果完全错了也没关系。另外,队列/堆栈解决方案有什么问题?为什么另一个ADT无效?我不清楚问题是什么。如果您更具体一些,它会有所帮助:addNode必须做什么(作为根添加值?保持平衡?)以及您现在是如何做的(例如,什么公理)?我现在唯一能说的是,表示法很好(除了使用“树”作为函数和类型)。不清楚的是你被困在哪里了。你能举个例子说明你到目前为止取得了什么成果吗?是的