2017-10-19 189 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中,并且不允许打印“*”。

相关问题