【问题标题】:AVL tree: Python inheritance issueAVL 树:Python 继承问题
【发布时间】:2015-09-02 00:52:54
【问题描述】:

我有树类:BinarySearchTree、TreeNode 和 AVLTree。

TreeNode 类用于 BinarySearchTree 类。 AVLTree继承了BinarySearchTree,代码如下:

from Tnode import TreeNode
  class BinarySearchTree:
         def __init__(self):
             self.root = None
             self.size = 0

树节点类如下所示:

class TreeNode:
    def __init__(self,key,val,left=None,right=None,parent=None):
        self.key = key
        self.payload = val
        self.leftChild = left
        self.rightChild = right
        self.parent = parent

AVLTree 类:

from  Tnode import TreeNode
from binstree import BinarySearchTree

class AVLTree(BinarySearchTree):
    def __init__(self,key,val,left=None,right=None,parent=None,balanceFactor=0):
        TreeNode.__init__(self,key,val,left,right,parent)
        self.balanceFactor = balanceFactor     
        self.root = None
        self.size = 0

每当我运行 AVLTree 类时,我都会收到此错误:AttributeError: TreeNode instance has no attribute 'balanceFactor'

我做错了什么?代码可以在这里查看: http://interactivepython.org/runestone/static/pythonds/Trees/AVLTreeImplementation.html

http://interactivepython.org/runestone/static/pythonds/Trees/SearchTreeImplementation.html

【问题讨论】:

  • 你为什么在你的AVLTree.__init__方法中调用TreeNode.__init__,而你根本没有从TreeNode继承?

标签: python tree binary-search-tree avl-tree


【解决方案1】:

我不完全确定我完全理解您的代码,但在我看来,您的问题(或至少您的一个问题)在这一行 TreeNode.__init__(self,key,val,left,right,parent)

我敢打赌你不想传递self 参数,因为它是AVLTree 类型,而解释器期待TreeNode 类型。 现在我认为您可能想要在 AVLTree 构造函数中做的是简单地创建一个 TreeNode 对象作为您的 AVL 根节点。要在 Python 中创建类的实例,您无需显式调用 __init__ 方法。你可以简单地做class_instance = Class(parameters),或者在你的情况下self.root = TreeNode(key, val, left, right, parent)

所以,我们可以将您发布的内容变成这样:(我只会展示我更改的内容,其余的课程对我来说似乎很好)

class AVLTree(BinarySearchTree):
def __init__(self, key, val, left=None, right=None, parent=None, balancefactor=0):
    self.balanceFactor = balancefactor
    self.root = TreeNode(key, val, left, right, parent)
    self.size = 1

我们正在使用传递给树构造函数的信息来创建根节点并更新树的大小。您可以创建一个没有大问题的带有根节点的简单 AVL 树:

if __name__ == '__main__':
     avl = AVLTree("key", "val")

【讨论】:

  • 我这样做了,它仍然返回相同的错误。但我现在能够解决它。它在某个地方几乎没有错误。
【解决方案2】:

查看您正在处理的文本后,我想我知道您在哪里变得困惑。从BinarySearchTreeAVLTree 类的更改需要使用新的balanceFactor 属性更新TreeNode 类(或者可能创建一个新的AVLTreeNode 类)。这在文本中从未具体描述过,因此您已经开始将节点需要的新内容合并到不合适的 Tree 类中。

相反,将 balanceFactor 内容放入适当的 Node 类中:

class AVLTreeNode(TreeNode):
    def __init__(self,key,val,left=None,right=None,parent=None,balanceFactor=0):
        TreeNode.__init__(self,key,val,left,right,parent)
        self.balanceFactor = balanceFactor

现在您的AVLTree 代码只需要创建AVLTreeNode 对象而不是TreeNode 对象,它会在需要时找到适当的balanceFactor 属性。

【讨论】:

    猜你喜欢
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    相关资源
    最近更新 更多