Advertisement
stalkeryga

nastya1

Mar 21st, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.99 KB | None | 0 0
  1. class Node:
  2. def __init__(self, data=None, left=None, right=None):#описание труктуры узла дерева
  3. self.data = data#данные,которые хранит узел
  4. self.left = left#ссылка на левого сына
  5. self.right = right#ссылка на правого сына
  6.  
  7. def __str__(self):#переопределение метода str()д для корректного отображения узла
  8. return 'Node [' + str(self.data) + ' Левый: ' + str(self.left) + ' Правый: ' + str(self.right) + ']'
  9.  
  10.  
  11. class Tree:
  12.  
  13. def __init__(self):
  14. self.root = None#ссылка на корень дерева
  15.  
  16. def __str__(self):#переопределение метода str()д для корректного отображения дерева
  17. return str(self.root)
  18.  
  19. def createTree(self, node, treelist, nodePath, data):#создание сцепленного предтавления дерева
  20. node.data = int(data)#присвоение узлу данных
  21. for nodes in treelist:#перебор всех строк
  22. if nodes[0][:-1:] == str(nodePath): # если узел с данным путем найден
  23. if nodes[0][len(nodes[0]) - 1] == "0":#описание для левого узла
  24. node.left = Node()
  25. self.createTree(node.left, treelist, nodes[0], nodes[1])
  26. elif nodes[0][len(nodes[0]) - 1] == "1":#описание для правого узла
  27. node.right = Node()
  28. self.createTree(node.right, treelist, nodes[0], nodes[1])
  29.  
  30. def recurse(self, node):#выполнение задачи рекурсивным методом
  31. value = 0#инициализация переенной для хранения суммы значений узлов поддеревьев
  32. if node != None:#если узел существует
  33. value += self.recurse(node.left) + self.recurse(node.right)#ссумируем значения его сыновей
  34. if node.left != None or node.right != None:#если это не лист
  35. node.data = value#присваиваем значению узла значение переменной
  36. else:#если лист отсутствует
  37. return 0#возвращаем нуль
  38. return int(node.data)#возвращаем значение данного узла
  39.  
  40. def nonrecurse(self):#выполнение задачи нерекурсивным методом
  41. node = self.root# начальный обход начинается с корня
  42. stack = []#инициализация стека для хранения узлов
  43. lastNodeVisited = None#иницилизация
  44. while stack != [] or node != None:#пока стек не опустел
  45. value = 0
  46. if node != None:
  47. stack.append(node)
  48. node = node.left
  49. else:
  50. peekNode = stack[len(stack) - 1]
  51. if peekNode.left == None and peekNode.right == None:
  52. value = peekNode.data
  53. if peekNode.right != None and lastNodeVisited != peekNode.right:
  54. node = peekNode.right
  55. else:
  56. if peekNode.right != None:
  57. value += peekNode.right.data
  58. if peekNode.left != None:
  59. value += peekNode.left.data
  60. peekNode.data = value
  61. lastNodeVisited = stack[len(stack) - 1]
  62. stack.pop()
  63.  
  64.  
  65. def main():
  66. treelist1 = []#инициализация списков для хранения узлов при считывании из txt
  67. file1 = open('Tree1.txt', 'r')#открытие файлов
  68. for line in file1:
  69. treelist1.append(line.split())#копирование строк в список
  70. tree2 = Tree()
  71. tree2.root = Node()
  72. tree2.createTree(tree2.root, treelist1, 0, treelist1[0][1])
  73. tree1 = Tree()
  74. tree1.root = Node()#инициализация деревьев
  75. tree1.createTree(tree1.root, treelist1, 0, treelist1[0][1])#создание сцепленной структуры дерева
  76. print("Дерево 1: " + str(tree1))#вывод сцеленной труктуры дерева
  77. tree1.recurse(tree1.root)#выполнение рекурсивного метода
  78. print("Дерево 1 рекурсивно: " + str(tree1))#вывод состояние дерева после рекурсивного метода
  79. tree2.nonrecurse()#выполнение нерекурсивного метода
  80. print("Дерево 1 не рекурсивно: " + str(tree1))#вывод состояние дерева после рекурсивного метода
  81.  
  82.  
  83. if __name__ == '__main__':
  84. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement