二叉树AttributeError:'NoneType'对象没有属性'insertRight'

时间:2014-12-25 21:32:41

标签: python class python-2.7 tree binary-tree

我一直在阅读这本书here,我正在尝试完成上一次要求您构建二叉树的练习。然而,我很难理解如何添加树项目。

这是BinaryTree类:

  class BinaryTree(object):
        def __init__(self, rootObj):
            self.key = rootObj
            self.leftChild = None
            self.rightChild = None

        def insertLeft(self, newNode):
            if self.leftChild == None:
                self.leftChild = BinaryTree(newNode)
            else:
                t = BinaryTree(newNode)
                t.leftChild = self.leftChild
                self.leftChild = t

        def insertRight(self, newNode):
            if self.rightChild == None:
                self.leftChild = BinaryTree(newNode)
            else:
                t = BinaryTree(newNode) # make a new BinaryTree first
                t.rightChild = self.rightChild
                self.rightChild = t 

        def getRightChild(self):
            return self.rightChild

        def getLeftChild(self):
            return self.leftChild

        def setRootVal(self, obj):
            self.key = obj 

        def getRootVal(self):
            return self.key

当我尝试向树中添加项目时,它们并没有真正按照我的预期进行。

例如,如果我执行以下代码:

a = BinaryTree('a')
a.insertLeft('b')
a.getLeftChild().insertRight('c')
a.insertRight('w')
a.getRightChild().insertRight('x')   #this one raises an error

最后一行导致AttributeError: 'NoneType' object has no attribute 'insertRight' 为什么这一行会导致此错误?为什么第3行不会引发错误?

1 个答案:

答案 0 :(得分:1)

您的insertRight方法会在左侧

上插入
def insertRight(self, newNode):
    if self.rightChild == None:
        self.leftChild = BinaryTree(newNode)
        #    ^^^^

因此,您的所有rightChild属性将永久保留None

您应该使用is来测试None

def insertRight(self, newNode):
    if self.rightChild is None:
        self.rightChild = BinaryTree(newNode)
    else:
        t = BinaryTree(newNode) # make a new BinaryTree first
        t.rightChild = self.rightChild
        self.rightChild = t