函数未被引用调用导致自我.root非

2024-05-20 14:09:56 发布

您现在位置:Python中文网/ 问答频道 /正文

class node:
    def __init__(self,data):
        self.data=data
        self.left=None
        self.right=None
class btree:

    def __init__(self):
        self.root=None

    def insertt(self,root, data):
        if root==None:
            root=node(data)
        elif root.data > data:
            self.insertt(self,root.left, data)
        else:
            self.insertt(self,root.right, data)
    def insert(self,data):
        self.insertt(self.root, data)
    def printall(self):
        self.printtall(self.root)
    def printtall(self,root):
        if root==None:
            print "reached end "
        else:
            printtall(root.left)
            print root.data
            printtall(root.right)

a=btree()
a.insert(2)
a.insert(1)
a.insert(6)
a.insert(3)
a.printall()

所以自我.root总是没有。我是C++程序员,我发现很难处理Python,因为这里没有找到引用。我该怎么做才能让它成功呢?谢谢你的帮助。在


Tags: selfrightnonenodedataifinitdef
3条回答

在函数“insertt”的根赋值之前有一个return语句

这是工作代码,我将在评论中解释问题。在

class node:
    def __init__(self,data):
        self.data=data
        self.left=None
        self.right=None
class btree:

    def __init__(self):
        self.root = None

    def insertt(self, root, data):
        if root==None:
            #earlier you tried to return here which leads to dead end.
            self.root = node(data)
        else:    
            #You need the assign the data here, as if you'll
            #try to update in the above if statement you are doing 
            #nothing but just updating the root again and again
            if root.data > data:
                if root.left == None:
                    root.left = node(data)
                else:    
                    self.insertt(root.left, data)
            else:
                if root.right == None:
                    root.right = node(data)
                else:    
                    self.insertt(root.right, data)
    def insert(self,data):
        self.insertt(self.root, data)
    def printtall(self,root):
        #inorder traversal
        if root != None:
            self.printtall(root.left)
            print (root.data)
            self.printtall(root.right)
    def printall(self):
        self.printtall(self.root)


a=btree()
a.insertt(a.root, 2)
a.insertt(a.root, 1)
a.insertt(a.root, 6)
a.insertt(a.root, 3)
a.printall()

输出-

^{pr2}$

这是我的解决办法。请注意,我将类名更改为混合大小写,以遵循标准约定并更容易避免名称冲突。在

class Node(object):
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None

class BTree(object):
    def __init__(self):
        self.root = None

    def insert(self, data):
        self.root = self.insertt(self.root, Node(data))

    def insertt(self, root, node):
        if root == None:
            root = node
        elif node.data < root.data:
            root.left = self.insertt(root.left, node)
        else:
            root.right = self.insertt(root.right, node)

        return root

    def printall(self):
        self.printtall(self.root, 0)

    def printtall(self, root, indent):
        if root == None:
            print ". " * indent + "(empty)"
        else:
            print ". " * indent + str(root.data)
            self.printtall(root.left, indent + 1)
            self.printtall(root.right, indent + 1)

a = BTree()
a.insert(2)
a.insert(1)
a.insert(6)
a.insert(3)
a.printall()

这是输出。我将print函数改为使用前缀而不是中缀排序,因为我发现它更清晰,但是如果您愿意,可以很容易地将其改回来:

^{pr2}$

相关问题 更多 >