【问题标题】:Is it a mandatory to have two classes(Node,Tree) while implementing a binary tree?在实现二叉树时是否必须有两个类(节点,树)?
【发布时间】:2021-01-15 21:44:42
【问题描述】:

这可能听起来很傻,但相信我,我在网上搜索了各种文章,找不到合适的解释或根本没有解释,是否真的需要两个类一个用于 Node 和一个用于树来实现二叉树?以一个简单的python代码为例:

class Node():
    def __init__(self,data):
        self.data = data
        self.left = None
        self.right = None
        

class BinaryTree():
    def __init__(self):
        self.head = None

这基本上是我在许多在线文章中看到的,最近我开始学习 AlgoExpert 课程,其中有一个关于将二叉树作为输入和目标值作为另一个输入并获得最接近值的函数的问题树中的目标值并返回它。

这段代码如下:

 #This is the class of the input root. Do not edit it.
    class BinaryTree:
        def __init__(self, data):
            self.data = data
            self.left = None
            self.right = None

现在看到这个 sn-p 我完全糊涂了,我怎样才能只使用一个类? 我试图在这里理解这个概念,这对某些人来说可能听起来很傻,但我宁愿问这个问题也不愿后悔根本不问。任何意见表示赞赏。

【问题讨论】:

  • 我的第一个想法是树中的任何节点都可以解释为它下面的整个子树的表示。因此,这种简单的实现不需要单独的类。
  • 如果您有单独的 Tree/Node 类,那么无论对内容进行什么更改,Tree 对象都可以保持其身份 - 包括根本没有节点,或者某些更改哪个节点的操作树的根。只有一个类,您只能方便地处理不更改根的操作——但这​​通常是特定应用程序所需要的。

标签: python class object data-structures binary-tree


【解决方案1】:

可以只用一个类实现一棵树,但它的 API 比用两个单独的类实现的要有限得多。在许多情况下,拥有一个单独的容器对象更有意义,而单类实现将需要其用户处理特殊情况。

例如,一棵空树很容易用两个单独的类来表示。它将是带有 head 引用的 Tree 类的实例,该引用通常指向 Node 实例,而是指向 None。所有Tree 方法都知道如何处理这种情况,因此用户不需要做任何特别的事情。

要表示只有一个类的空树,您只需引用None,因为没有根节点可以指向。这可能很不方便,因为您将无法在其上调用任何 Tree 相关方法。任何尝试引用根节点的情况都需要有特殊的逻辑来处理空树的情况。

但有时您不需要花哨的 API,只需一个非常基本的 API 即可满足您对数据结构的有限使用。在那种情况下,处理一个微不足道的特殊情况并不是那么大的负担。编写额外的课程可能需要更多的工作。

【讨论】:

    【解决方案2】:

    是的,您只能使用一个类来实现一棵树,例如,您提供的第一个 sn-p 中的 Node 类就足够了。

    话虽如此,如果您只有一个类,则必须始终保留一个引用根节点的对象,以便您可以访问树。

    BinaryTree 类(在第一个 sn-p 中)可以帮助做到这一点,但这不是必需的。

    使用第二个 sn-p 中的 BinaryTree 并声明树的示例代码:

    class BinaryTree:
        def __init__(self, data):
            self.data = data
            self.left = None
            self.right = None
    
    
    
    def main():
        root = BinaryTree(1)
        root.left = BinaryTree(2)
        root.right = BinaryTree(3)
    
    
    
    if __name__ == "__main__":
        main()
    

    【讨论】:

      【解决方案3】:

      不,你只需要节点类。然后通过根节点引用您的整个树。从数学上讲,您树的任何子树也是一棵树,即使您只有一个节点,它也会同时是叶子和该子树的根。

      如果您想更简单,请查看heaps,它们是通过数组实现的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-31
        • 2019-01-13
        • 2020-01-18
        • 1970-01-01
        • 1970-01-01
        • 2016-03-18
        • 2012-01-09
        相关资源
        最近更新 更多