2016-06-21 2 views
0
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() 

Also ist die self.root immer None. Ich bin ein C++ - Programmierer und ich finde es schwierig, mit Python umzugehen, da ein Anruf per Referenz hier nicht gefunden wird. Was soll ich tun, damit es funktioniert? Danke für Ihre Hilfe.Funktion nicht durch Referenz aufgerufen bewirkt, dass self.root keine ist

+1

Wenn root keine ist, dass Sie die Wurzel zurückkehren (beim Einfügen). Die Rückgabe beendet die Funktion. – syntonym

+0

@syntonym ja, aber die Rückkehr wird es auch in einigen Variablen richtig speichern? Sie können dieser Variablen nichts hinzufügen, was sich auf die reale Variable auswirken würde. Wenn Sie Recht haben, geben Sie bitte Ihre Codeversion an. –

+0

@TomKarzes könnten Sie Ihre Version des gleichen Codes veröffentlichen? Bitte bearbeiten Sie es –

Antwort

1

Hier ist der Arbeitscode ist, werde ich erklären, die Probleme in den Kommentaren.

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() 

Ausgang -

1 
2 
3 
6 
+1

Wenn Sie also die Funktion self.insertt (self.root, data) aufrufen, geht eine Kopie von self.root dorthin. Ist es nicht? Python unterstützt den Aufruf per Referenz nicht. Wie funktioniert es dann? –

+0

Nun, die erste if-Anweisung läuft nur einmal, das ist klar, oder? Ich habe den Code bearbeitet, 'seld.root.left' war ein falscher Anruf. Was es tut ist immer Links ** in Bezug auf die Wurzel **. Python ist Aufruf von Objektreferenz, Sie erhalten, wie es von dieser Quelle funktioniert, es erklärt es wirklich gut ... – hashcode55

+0

http://robertheaton.com/2014/02/09/pythons-pass-by-object-reference -als erklärt-by-philip-k-dick / – hashcode55

0

Sie eine return-Anweisung vor der Zuweisung an die Wurzel in der Funktion „insertt“

+0

versucht, aber konnte es nicht funktionieren. Wie würden Sie die return-Anweisung für dasselbe verwenden? Könnten Sie eine bearbeitete Version des obigen Codes für das gleiche hochladen? –

+0

überprüfen Sie jetzt. es funktioniert nicht –

1

Hier ist meine Lösung für dieses Problem haben. Beachten Sie, dass ich die Klassennamen in Groß- und Kleinschreibung geändert habe, um den Standardkonventionen zu folgen und Namenskonflikte zu vermeiden.

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() 

Hier ist der Ausgang. Ich die Druckfunktion geändert Präfix zu verwenden, anstatt Infix Ordnung, weil ich fand es klarer zu sein, aber man kann es leicht wieder ändern, wenn Sie bevorzugen:

2 
. 1 
. . (empty) 
. . (empty) 
. 6 
. . 3 
. . . (empty) 
. . . (empty) 
. . (empty) 
Verwandte Themen