繁体   English   中英

AVL树:Python继承问题

[英]AVL tree: Python inheritance issue

我有树类: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

我不能完全确定我是否完全理解您的代码,但是在我看来,您的问题(或至少您的问题之一)在此行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")

看完您要处理的文字后,我想我发现您感到困惑了。 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属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM