Постройка и обход Бинарного дерева, inorder postorder preorder.Ребята помогите ускорить код, система в тестах не принимает по лимиту времени(
Первая строка входных данных это число вершин в дереве, вторая это корень дерева и соответсвенно его дети ltft right, и последующие это вершины дерева и тоже с детьми left right, если -1 значит детей нету.вот пример входных и выходных данных
10-число вершин 0-это корень бинарного дерева у 0 левый ребенок это 7ая входная строчка(соответственно 70) и правый ребенок 2ая входная строчка соответственно 20, ну и так далее.. Sample Input:
10 0 7 2 10 -1 -1 20 -1 6 30 8 9 40 3 -1 50 -1 -1 60 1 -1 70 5 4 80 -1 -1 90 -1 -1
Sample Output:
50 70 80 30 90 40 0 20 10 60 0 70 50 40 30 80 90 20 60 10 50 80 90 30 40 70 10 60 20 0
Вот код, он рабочий но по времени не проходит, как его ускорить хз((
a = int(input())
doo = []
v = []
z = 1
for x in range(a):
b = [int(x) for x in input().split()]
if z == 1:
doo.extend(['insert ' + str(b [0]) + " at root"])
if b [1] != -1 and b [2] != -1:
doo.extend(['insert ' + str(b [1]) + ' left ' + "of " + str(b [0])])
doo.extend(['insert ' + str(b [2]) + ' right ' + "of " + str(b [0])])
elif b [1] != -1 and b [2] == -1:
doo.extend(['insert ' + str(b [1]) + ' left ' + "of " + str(b [0])])
elif b [1] == -1 and b [2] != -1:
doo.extend(['insert ' + str(b [2]) + ' right ' + "of " + str(b [0])])
v.append(b [0])
z += 1
class BinaryTree:
def __init__(self, key=None):
self.key = key
self.left = None
self.right = None
def set_root(self, key):
self.key = key
def insert_left(self, new_node):
self.left = new_node
def insert_right(self, new_node):
self.right = new_node
def search(self, key):
if self.key == key:
return self
if self.left is not None:
temp = self.left.search(key)
if temp is not None:
return temp
if self.right is not None:
temp = self.right.search(key)
return temp
return None
btree = None
k = 1
for do in doo:
operation = do.split() [0]
if operation == 'insert':
if k == 1:
data = int(do.split() [1])
k += 1
else:
data = v [int(do.split() [1])]
new_node = BinaryTree(data)
suboperation = do.split() [2]
if suboperation == 'at':
btree = new_node
else:
position = do.split() [4]
key = int(position)
ref_node = None
if btree is not None:
ref_node = btree.search(key)
if ref_node is None:
doo.extend([do])
continue
if suboperation == 'left':
ref_node.insert_left(new_node)
elif suboperation == 'right':
ref_node.insert_right(new_node)
def Preorder(btree) :
if btree:
print(btree.key,end=" ")
Preorder(btree.left)
Preorder(btree.right)
def Inorder(btree):
if btree:
Inorder(btree.left)
print(btree.key,end=" ")
Inorder(btree.right)
def Postorder(btree) :
if btree :
Postorder(btree.left)
Postorder(btree.right)
print(btree.key,end=" ")
Inorder(btree)
print()
Preorder(btree)
print()
Postorder(btree)