2015-04-01 1 views
0

Так что я довольно новичок в программировании, и я пытаюсь сделать мою функцию удаления в своем двоичном дереве поиска, чтобы удалить на стороне с наивысшей глубиной узлов. Тем не менее, я все время получаю сообщение об ошибке, когда пытаюсь запустить его, и я знаю, что это простое исправление, но я не могу понять это после прочтения нескольких подобных вопросов.Двоичный поиск Tree 'Int object not itable'

Вот моя ошибка, я получаю:

C:\Python33\python.exe "C:/Users/koopt_000/Desktop/College/Sophomore Semester 2/Computer Science 231/Chapter7/Test.py" 
Traceback (most recent call last): 
    File "C:/Users/koopt_000/Desktop/College/Sophomore Semester 2/Computer Science 231/Chapter7/Test.py", line 10, in <module> 
    a.delete(tree, 9) 
    File "C:\Users\koopt_000\Desktop\College\Sophomore Semester 2\Computer Science 231\Chapter7\BinarySearchTree.py", line 111, in delete 
    ldepth == max(self.height(root.left)) 
TypeError: 'int' object is not iterable 

Process finished with exit code 1 

Вот мои следующие части кода, начиная с моих TreeNodes, в BST (основная функция), а затем мой тестовый код.

class TreeNode(object): 

    def __init__(self, data = None, left=None, right=None): 
     self.item = data 
     self.left = left 
     self.right = right 

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

from TreeNode import TreeNode 


class BST(object): 

    #------------------------------------------------------------ 

    def __init__(self): 

     """create empty binary search tree 
     post: empty tree created""" 

     self.root = None 
     self.size = 0 

    def delete(self, root, item, ldepth = 0, rdepth = 0): 

     """remove item from binary search tree 
     post: item is removed from the tree""" 


     if ldepth == 0: 
      ldepth == max(self.height(root.left)) 
     if rdepth == 0: 
      rdepth == max(self.height(root.right)) 

     if ldepth > rdepth: 
      depth = ldepth 
      print(depth) 
     elif ldepth < rdepth: 
      depth = rdepth 
      print(depth) 
     else: 
      depth = ldepth 
      print(depth) 

     self.root = self._subtreeDelete(root, item, depth) 

    #------------------------------------------------------------ 

    def _subtreeDelete(self, root, item, depth): 

     if root is None: # Empty tree, nothing to do 
      return None 
     if item < root.item:        # modify left 
      root.left = self._subtreeDelete(root.left, item) 
     elif item > root.item:       # modify right 
      root.right = self._subtreeDelete(root.right, item) 
     else:           # delete root 
      if root.left is None:      # promote right subtree 
       root = root.right 
      elif root.right is None:      # promote left subtree 
       root = root.left 
      else: 
       # root node can't be deleted, overwrite it with max of 
       # left subtree and delete max node from the subtree 
       root.item, root.left = self._subtreeDelMax(root.left) 
     return root 

    #------------------------------------------------------------ 

    def _subtreeDelMax(self, root): 

     if root.right is None:   # root is the max 
      return root.item, root.left # return max and promote left subtree 
     else: 
      # max is in right subtree, recursively find and delete it 
      maxVal, root.right = self._subtreeDelMax(root.right) 
      return maxVal, root 

    def height(self, root): 
     if root is None: 
      return 0 
     else: 
      return max(self.height(root.left), self.height(root.right)) + 1 

from BinarySearchTree import BST 
from TreeNode import TreeNode 

tree = TreeNode(4, TreeNode(2, TreeNode(1), TreeNode(3)), TreeNode (7, TreeNode(6),TreeNode(9))) 


a = BST() 
a._subtreeInsert(tree, 10) 
a._subtreeInsert(tree, 5) 
a.delete(tree, 9) 

print("PRE-ORDER TRANSVERSE:") 
print(a.preOrder(tree)) 
print("IN-ORDER TRANSVERSE:") 
print(a.inOrder(tree)) 
print("POST-ORDER TRANSVERSE:") 
print(a.postOrder(tree)) 

print("The max depth of the tree is,", a.height(tree),"nodes deep.") 
print("There are,", a.treeSize(tree),"nodes in this tree.") 

Может кто-нибудь сказать мне, что случилось? Мне нужно это для работы, чтобы моя функция удаления работала правильно,

+1

Что вы ожидаете 'max (self.height (root.left))' делать? – user2357112

+0

Я думал, что это даст глубину узлов с левой стороны ... – Cooper

+0

Почему вызов 'max'? – user2357112

ответ

0

Функция max() в python принимает итерируемый объект, как список, в котором он может выполнять итерацию, чтобы найти максимальное значение.

self.height(root.left) 

является одной ИНТ, по существу, одно значение, которое не является iteratable, который бросает свою ошибку.

+0

Но когда я делаю это, он возвращает '0'. Как максимум. – Cooper

+0

Хорошо, что ваш код имеет 'def height (self, root):' как определение метода и когда вы вызываете 'ldepth == self.height (root.left)', вы указали только один параметр, а затем под определение функции высоты у вас есть 'def height (self, root): , если root is None: return 0', поэтому он будет возвращать 0 каждый раз. поэтому вам нужно добавить этот корень param -> 'self.height (root.left, * theroot *)' – Danoram

+0

извините за беспорядочный ответ .. Я ненавижу форматирование комментариев на этом сайте. – Danoram