【发布时间】:2009-03-12 10:02:59
【问题描述】:
我正在做一个名为数据结构和算法的单元。我们刚刚开始,我的教授刚刚教给我们什么是代数语义以及什么是公理等基础知识。到目前为止,我只是以数组的形式使用树。不使用预排序树的签名作为树(值,树,树),其中值是节点中的值,左节点是第一棵树,右节点是第二棵树。
现在我将树定义为树(值,树,树)或 Nil,我不知道如何为 addNode(值,树)定义代数。
每个级别都变得越来越复杂,另外,我无论如何也想不到一次扫描一个级别,从现在开始已经尝试了一个小时。当我们沿着树向下走时,代数只是分支成越来越多的 if-else。我做对了吗?你能为我指出正确的方向吗?或者树不能实现为树(值,树,树)?
这是我教程的一部分(不值得任何分数,在附加问题中),但我不是在寻找即时答案,我喜欢这个主题,并想了解更多信息。
编辑1:我查看了维基百科,我不想使用教科书来获得明确的答案,我只是在寻找正确方向的提示,无论我的方法是正确的还是完全无法定义一棵树作为树(值,树,树)。我知道您可以以列表的形式表示树 ADT。但我真的想好好想想。希望这是有道理的。非常感谢各位!
编辑 2:嗯,很难在互联网上解释。假设我正在定义一个名为“树”的新数据结构。我可以以任何我想要的方式定义它,它必须表现得像一个平衡的二叉树(虽然,父母和孩子的价值并不重要) 所以我将它定义为树:tree(value, tree, tree) OR nil 这不是编程代码,这只是我定义它的方式。 Tree 是一个值 + 2 棵其他树,或者 Tree 是 nil。现在 addNode(value, tree) 向树添加一个节点,同时仍然保持平衡。 它不是编程代码,它只是代数语义。不知道能不能解释清楚。但是我找到了一个可以使用队列或堆栈实现的解决方案,但这是我必须定义的另一个 ADT,它是无效的。
编辑 3:似乎我假设了许多使问题变得比实际应该更难的事情。首先,从我给出的一点解释来看,Gamecat 的回答是完美的。但我同意 cmets,包含其他 ADT 是完全有效的。事实上,当我们构建任何使用 Int 的东西时,我们正在为该结构使用 ADT。我认为每个 ADT 都必须是独一无二的。无论如何,非常感谢您的回答!
【问题讨论】:
-
我不清楚问题是什么。如果您更具体一些,它会有所帮助:addNode 必须做什么(作为根添加值?保持平衡?)以及您现在如何做(例如什么公理)?我现在唯一能说的是表示很好(除了使用“树”作为函数和类型)。
-
我得到了代数部分。不清楚的是你被困在哪里。你能举例说明你到目前为止得到了什么吗?如果完全错了也没关系。另外,队列/堆栈解决方案有什么问题?为什么另一个 ADT 无效?
标签: tree binary-tree abstract-data-type