【问题标题】:Binary search tree python with OOP带有OOP的二叉搜索树python
【发布时间】:2020-06-09 05:29:37
【问题描述】:

我正在尝试理解 python 和 OOP 以及数据结构 我现在正在研究二叉搜索树的实现 这是节点结构的类

class Node():
    def __init__(self, data):
        self.data = data
        self.leftChild = None
        self.rightChild = None

此代码的开发人员在 Node 类和另一个名为 tree 的类中创建了插入功能 这是它在节点类中的样子:

def insert(self, data):
    if self.data == data:
        return False        

    elif data < self.data:
        if self.leftChild:
            return self.leftChild.insert(data)
        else:
            self.leftChild = Node(data)
            return True

    else:
        if self.rightChild:
            return self.rightChild.insert(data)
        else:
            self.rightChild = Node(data)
            return True

然而,他在树类中创建了一个同名的函数,看起来像这样

class Tree():
    def __init__(self):
        self.root = None

    def insert(self, data):
        if self.root:
            return self.root.insert(data)
        else:
            self.root = Node(data)
            return True

我现在确实有一些问题,为什么有两个同名的函数?当我尝试在此代码上执行其中一个而不执行另一个时,它会显示错误

if __name__ == '__main__':
    tree = Tree()
    tree.insert(10)

为什么他为树而不是节点创建实例? 谁能帮我解释一下这些概念,谢谢!

【问题讨论】:

  • 严格来说,通常你可以在没有额外的 Tree 类的情况下相处。然而,在语义上,树和节点是两个不同的概念。此外,仅使用节点类,您将无法表示一棵空树(至少是一棵可以调用方法的有意义的树)。

标签: python algorithm data-structures binary-search-tree


【解决方案1】:

当您创建 tree 对象时,它不会创建任何节点。它只是用None 定义了一个root 变量。调用 tree.insert() 方法时正在创建节点。

Tree 类中的insert() 方法正在检查root 是否为None,它创建了一个新的Node。否则调用Node类中的insert方法。

为什么他为树而不是节点创建实例?

因为Node 类中的insert() 方法只处理树至少有一个节点或树不为空的情况。这就是他创建Tree 实例的原因。

Tree 类中带有insert() 方法的代码:

class Node():
    def __init__(self, data):
        self.data = data
        self.leftChild = None
        self.rightChild = None

class Tree():
    def __init__(self):
        self.root = None

    def insert(self, root, data):
        if root is None:
            self.root = Node(data)
        elif root.data < data:
            if root.rightChild is None:
                root.rightChild = Node(data)
            else:
                self.insert(root.rightChild, data)
        else:
            if root.leftChild is None:
                root.leftChild = Node(data)
            else:
                self.insert(root.leftChild, data)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 2019-04-17
    相关资源
    最近更新 更多