【问题标题】:python (nontype comparison with int)python(与int的非类型比较)
【发布时间】:2018-02-08 21:30:41
【问题描述】:

实际上我正在尝试制作二叉搜索树,但 self.value 中有一个 nonetype ..所以有一个错误说

class Tree:
    def __init__(self,initval=None):
        self.value=initval
        if self.value:
            self.left=Tree()
            self.right=Tree()
        else :
            self.left=None
            self.right=None

        return


    def isempty(self):
        return (self.value==None)

    def isleaf(self):
        return (self.left.isempty() and self.right.isempty())

    # convert a leaf node to an empty node
    def makeempty(self):
        self.value=None
        self.left=None
        self.right=None

        return

    def copyright(self):
        self.value=self.right.value
        self.left=self.right.left
        self.right=self.right.right
        return


    def find(self,v):
        if self.isempty():
            return (False)

        if self.value==v:
            return (True)

        if v<self.value:
            return (self.left.find(v))

        if v>self.value:
            return (self.right.find(v))


    def insert(self,v):
        if self.isempty():
            self.value==v
            self.left=Tree()
            self.right=Tree()

        if self.value==v:
            return

        if v < self.value:
            self.left.insert(v)
            return
        if v >self.value:
            self.right.insert(v)
            return


    def maxval(self):
        if self.right.isempty():
            return(self.value)
        else:
            return (self.right.maxval())


    def delete(self,v):
        if self.isempty():
            return
        if v<self.value:
            self.left.delete(v)
        if v>self.value:
            self.right.delete(v)


        if v==self.value:
            if self.isleaf():
                self.makeempty()
            elif self.left.isempty():
                self.copyright()
            else:
                self.value=self.left.maxval()
                self.left.delete(self.left.maxval())
            return

    def inorder(self):
        if self.isempty():
            return([])
        else:
            return (self.left.inorder()+[self.value]+self.right.inorder())


    def __str__(self):
        return(str(self.inorder()))

l=Tree(4)
for i in [1,3,2,6,8,55,44]:
    l.insert(i)

print(l)

【问题讨论】:

  • 在你的 find 函数中,你永远不会确保值不是None。而且,为什么要在二叉树上保存一个存储None值的节点?感觉不对,您应该删除该节点,并将其父 子设置为None

标签: python


【解决方案1】:

如果你在 if 中添加一个条件,以确保你实际上有一个左或右节点,并且你在实际节点中有一个不同于 None 的值。像这样的

def find(self,v):
    if self.value is None:
        return False

    if self.value==v:
        return (True)

    if v<self.value and self.left is not None:
        return (self.left.find(v))

    if v>self.value and self.right is not None:
        return (self.right.find(v))

    return False

我没有对其进行测试,但我认为应该可以。希望对您有所帮助。

顺便说一句,您可以研究二叉树中的迭代搜索,它比递归方法更有效

【讨论】:

    猜你喜欢
    • 2013-11-29
    • 2017-12-18
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    相关资源
    最近更新 更多