2017-10-19 191 views
2

我有一個問題,解析樹代碼。當我試圖用後期訂單展示它時,它給了我一個錯誤消息,應該是str參數,而不是int[python-3] TypeError:必須是str,而不是int

from classStack import Stack 
from classTree import BinaryTree 

def buildParseTree(fpexp): 
    fplist = fpexp.split() 
    pStack = Stack() 
    eTree = BinaryTree('') 
    pStack.push(eTree) 
    currentTree = eTree 
    for i in fplist: 
     if i == '(': 
      currentTree.insertLeft('') 
      pStack.push(currentTree) 
      currentTree = currentTree.getLeftChild() 

     elif i not in ['+', '-', '*', '/', ')']: 
      currentTree.setRootVal(int(i)) 
      parent = pStack.pop() 
      currentTree = parent 

     elif i in ['+', '-', '*', '/']: 
      currentTree.setRootVal(i) 
      currentTree.insertRight('') 
      pStack.push(currentTree) 
      currentTree = currentTree.getRightChild() 

     elif i == ')': 
      currentTree = pStack.pop() 

     else: 
      raise ValueError("No se contempla el carácter evaluado") 

    return eTree 

ParseTree = buildParseTree("(8 * 5)") 
ParseTree.printPostordenTree(0) 

錯誤:

Traceback (most recent call last): 
    File "C:\Users\Franco Calvacho\Downloads\Árboles\parseTree.py", line 38, in <module> 
    ParseTree.printPostordenTree(0) 
    File "C:\Users\Franco Calvacho\Downloads\Árboles\classTree.py", line 62, in printPostordenTree 
    self.getLeftChild().printPostordenTree(n+1) 
    File "C:\Users\Franco Calvacho\Downloads\Árboles\classTree.py", line 67, in printPostordenTree 
    print("Level: "+ str(n) + " " + self.getRootVal()) 
TypeError: must be str, not int 
[Finished in 0.2s] 

這裏的二叉樹代碼。我明確指出,BinaryTree代碼本身就可以,它不會給我那個錯誤信息。 在那個代碼下,我給你留下了python的評論,你可以看到

class BinaryTree(object): 
    def __init__(self, data): 
     self.key = data 
     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.rightChild = BinaryTree(newNode) 
     else: 
      t = BinaryTree(newNode) 
      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  

    def printPreordenTree(self, n): 
     if self.getRootVal() != None: 
      print("Level: "+ str(n) + " " + self.getRootVal()) 
      n+=1 

      if self.getLeftChild() != None: 
       self.getLeftChild().printPreordenTree(n) 

      if self.getRightChild() != None: 
       self.getRightChild().printPreordenTree(n) 
     return n 

    def printInordenTree(self, n): 
     if self.getRootVal() != None: 
      if self.getLeftChild() != None: 
       self.getLeftChild().printInordenTree(n+1) 

      print("Level: "+ str(n) + " " + self.getRootVal()) 
      n+=1 

      if self.getRightChild() != None: 
       self.getRightChild().printInordenTree(n) 
     return n 

    def printPostordenTree(self, n): 
     if self.getRootVal() != None: 
      if self.getLeftChild() != None: 
       self.getLeftChild().printPostordenTree(n+1) 

      if self.getRightChild() != None: 
       self.getRightChild().printPostordenTree(n+1) 

      print("Level: "+ str(n) + " " + self.getRootVal()) 
      n+=1 
     return n 

"""a = BinaryTree("a") 
a.insertLeft("b") 
a.insertRight("c") 
a.getLeftChild().insertLeft("d") 
a.getRightChild().insertLeft("e") 
a.getRightChild().insertRight("f") 
print("Imprimo el árbol de forma Preorden") 
a.printPreordenTree(0) 
print("\nImprimo el árbol de forma Inorden") 
a.printInordenTree(0) 
print("\nImprimo el árbol de forma Postorden") 
a.printPostordenTree(0)""" 
+3

可能的重複[在Python中使用字符串和整數生成字符串](https://stackoverflow.com/questions/2823211/making-a-string-out-of-a-string-and-an -integer-in-python) –

+1

'self.getRootVal()'可能在違規行上返回一個int。 –

+0

'currentTree.setRootVal(int(i))'將根設置爲一個整數。 'self.getRootVal()'返回整數,如上面Jared所說。該bug可能首先將其設置爲整數,節點需要是字符串。 – Annan

回答

4
print("Level: "+ str(n) + " " + self.getRootVal()) 
TypeError: must be str, not int 

這解釋了錯誤:只能追加使用「+」操作符,而不是整數,字符串爲字符串。 前三個參數是字符串,但不是self.getRootVal()

第一個可能的解決方案:它轉換爲str,像你這樣n做:

print("Level: "+ str(n) + " " + str(self.getRootVal())) 

或者您可以使用格式字符串:

print("Level: {} {}".format(n, self.getRootVal())) 

後者不要求你投的參數字符串,並可能更好的可讀性。

0

我發現了這個錯誤。謝謝大家的快速回答,這是我第一次使用Stack Overflow,並且我很高興注意。

再一次,謝謝。問題解決了。

我的錯誤是我把「)」放在第二個elif中,並且不允許打印「*」。

相關問題