Skip to content

Commit 2a32d1e

Browse files
authored
Merge pull request #207 from Ananyasingh2002/issue_183
Updated file arvore_binaria_de_busca.py
2 parents 2b31aca + f7db027 commit 2a32d1e

File tree

1 file changed

+136
-152
lines changed

1 file changed

+136
-152
lines changed

src/python/arvore_binaria_de_busca.py

Lines changed: 136 additions & 152 deletions
Original file line numberDiff line numberDiff line change
@@ -5,180 +5,164 @@
55
"""
66

77

8-
class Arvore:
9-
def __init__(self, chave):
10-
self.chave = chave
11-
self.esquerda = None
12-
self.direita = None
13-
14-
15-
# Metodos de Busca
16-
def busca_recursiva(no, chave):
17-
if no is None:
18-
print(f"{chave} nao foi encontrado na arvore")
19-
return
20-
if no.chave == chave:
21-
print(f"{chave} foi encontrado na arvore")
22-
return no
23-
if chave > no.chave:
24-
busca_recursiva(no.direita, chave)
8+
class TreeNode:
9+
def __init__(self, key):
10+
self.key = key
11+
self.left = None
12+
self.right = None
13+
14+
15+
# Search Methods
16+
def recursive_search(node, key):
17+
if node is None:
18+
print(f"{key} was not found in the tree")
19+
return None
20+
if node.key == key:
21+
print(f"{key} was found in the tree")
22+
return node
23+
if key > node.key:
24+
return recursive_search(node.right, key)
2525
else:
26-
busca_recursiva(no.esquerda, chave)
26+
return recursive_search(node.left, key)
2727

2828

29-
def busca_linear(no, chave):
30-
while no is not None:
31-
if no.chave == chave:
32-
return no
33-
elif chave > no.chave:
34-
no = no.direita
29+
def linear_search(node, key):
30+
while node is not None:
31+
if node.key == key:
32+
return node
33+
elif key > node.key:
34+
node = node.right
3535
else:
36-
no = no.esquerda
36+
node = node.left
3737
return None
3838

3939

40-
# Metodo de Insercao
41-
def insere(no, chave):
42-
if no is None:
43-
no = Arvore(chave)
40+
# Insertion Method
41+
def insert(node, key):
42+
if node is None:
43+
return TreeNode(key)
4444
else:
45-
if chave < no.chave:
46-
no.esquerda = insere(no.esquerda, chave)
45+
if key < node.key:
46+
node.left = insert(node.left, key)
4747
else:
48-
no.direita = insere(no.direita, chave)
49-
return no
50-
51-
52-
# Metodos de Impressao
53-
IMPRIME_ARVORE = ""
54-
55-
56-
def pre_ordem(no):
57-
global IMPRIME_ARVORE
58-
if no is None:
59-
return
60-
IMPRIME_ARVORE += str(no.chave) + ", "
61-
pre_ordem(no.esquerda)
62-
pre_ordem(no.direita)
63-
64-
65-
def em_ordem(no):
66-
global IMPRIME_ARVORE
67-
if no is None:
68-
return
69-
em_ordem(no.esquerda)
70-
IMPRIME_ARVORE += str(no.chave) + ", "
71-
em_ordem(no.direita)
72-
73-
74-
def pos_ordem(no):
75-
global IMPRIME_ARVORE
76-
if no is None:
77-
return
78-
pos_ordem(no.esquerda)
79-
pos_ordem(no.direita)
80-
IMPRIME_ARVORE += str(no.chave) + ", "
81-
82-
83-
# Acha a Altura da Arvore
84-
def maximo(a, b):
85-
if a > b:
86-
return a
87-
return b
88-
89-
90-
def altura(no):
91-
if no is None:
48+
node.right = insert(node.right, key)
49+
return node
50+
51+
52+
# Printing Methods
53+
def pre_order(node):
54+
if node is None:
55+
return []
56+
result = [node.key]
57+
result.extend(pre_order(node.left))
58+
result.extend(pre_order(node.right))
59+
return result
60+
61+
62+
def in_order(node):
63+
if node is None:
64+
return []
65+
result = []
66+
result.extend(in_order(node.left))
67+
result.append(node.key)
68+
result.extend(in_order(node.right))
69+
return result
70+
71+
72+
def post_order(node):
73+
if node is None:
74+
return []
75+
result = []
76+
result.extend(post_order(node.left))
77+
result.extend(post_order(node.right))
78+
result.append(node.key)
79+
return result
80+
81+
82+
# Finding the Tree's Height
83+
def tree_height(node):
84+
if node is None:
9285
return 0
93-
return 1 + maximo(altura(no.esquerda), altura(no.direita))
94-
95-
96-
# Metodos de Exclusao
97-
def busca_no_pai(no, ch):
98-
no_pai = no
99-
while no is not None:
100-
if no.chave == ch:
101-
return no_pai
102-
no_pai = no
103-
if no.chave < ch:
104-
no = no.direita
86+
return 1 + max(tree_height(node.left), tree_height(node.right))
87+
88+
89+
# Deletion Methods
90+
def find_parent(node, ch):
91+
parent_node = node
92+
while node is not None:
93+
if node.key == ch:
94+
return parent_node
95+
parent_node = node
96+
if node.key < ch:
97+
node = node.right
10598
else:
106-
no = no.esquerda
107-
return no_pai
99+
node = node.left
100+
return parent_node
108101

109102

110-
def maiorAesquerda(no):
111-
no = no.esquerda
112-
while no.direita is not None:
113-
no = no.direita
114-
return no
103+
def largest_on_left(node):
104+
node = node.left
105+
while node.right is not None:
106+
node = node.right
107+
return node
115108

116109

117-
def exclui(no, ch):
118-
atual = busca_linear(no, ch)
119-
if atual is None:
110+
def delete(node, ch):
111+
current = linear_search(node, ch)
112+
if current is None:
120113
return False
121-
noPai = busca_no_pai(no, ch)
122-
if atual.esquerda is None or atual.direita is None:
123-
if atual.esquerda is None:
124-
substituto = atual.direita
114+
parent = find_parent(node, ch)
115+
if current.left is None or current.right is None:
116+
if current.left is None:
117+
substitute = current.right
125118
else:
126-
substituto = atual.esquerda
127-
if noPai is None:
128-
no = substituto
129-
elif ch > noPai.chave:
130-
noPai.direita = substituto
119+
substitute = current.left
120+
if parent is None:
121+
node = substitute
122+
elif ch > parent.key:
123+
parent.right = substitute
131124
else:
132-
noPai.esquerda = substituto
133-
# AQUI DA FREE(ATUAL)
125+
parent.left = substitute
134126
else:
135-
substituto = maiorAesquerda(atual)
136-
atual.chave = substituto.chave
137-
if substituto.esquerda is not None:
138-
atual.esquerda = substituto.esquerda
127+
substitute = largest_on_left(current)
128+
current.key = substitute.key
129+
if substitute.left is not None:
130+
current.left = substitute.left
139131
else:
140-
atual.esquerda = None
141-
# FREE(substituto)
132+
current.left = None
142133
return True
143134

144135

145136
if __name__ == "__main__":
146-
arvore = Arvore(3) # Cria arvore (raiz)
147-
# Insere varios valores na arvore
148-
arvore = insere(arvore, 2)
149-
arvore = insere(arvore, 1)
150-
arvore = insere(arvore, 4)
151-
arvore = insere(arvore, 6)
152-
arvore = insere(arvore, 8)
153-
arvore = insere(arvore, 5)
154-
arvore = insere(arvore, 7)
155-
arvore = insere(arvore, 0)
156-
157-
busca_recursiva(arvore, 6) # Busca que imprime na propria funcao
158-
159-
if busca_linear(arvore, 6) is not None: # Retorna o NO ou None se nao encontrou
160-
print("Valor encontrado")
137+
tree = TreeNode(3) # Create a tree (root)
138+
# Insert several values into the tree
139+
tree = insert(tree, 2)
140+
tree = insert(tree, 1)
141+
tree = insert(tree, 4)
142+
tree = insert(tree, 6)
143+
tree = insert(tree, 8)
144+
tree = insert(tree, 5)
145+
tree = insert(tree, 7)
146+
tree = insert(tree, 0)
147+
148+
result = recursive_search(tree, 6)
149+
if result is not None:
150+
print("Value found")
161151
else:
162-
print("Valor nao encontrado")
163-
164-
print(f"Altura: {altura(arvore)}")
165-
166-
# Exclui varios valores
167-
exclui(arvore, 7)
168-
exclui(arvore, 5)
169-
exclui(arvore, 8)
170-
exclui(arvore, 3)
171-
172-
# Chama os metodos de impressao
173-
IMPRIME = ""
174-
pre_ordem(arvore)
175-
print(f"PreOrdem: {IMPRIME}")
176-
IMPRIME = ""
177-
em_ordem(arvore)
178-
print(f"EmOrdem: {IMPRIME}")
179-
IMPRIME = ""
180-
pos_ordem(arvore)
181-
print(f"PosOrdem: {IMPRIME}")
182-
183-
# Mostra a altura da arvore apos remover os itens
184-
print(f"Altura: {altura(arvore)}")
152+
print("Value not found")
153+
154+
print(f"Height: {tree_height(tree)}")
155+
156+
# Delete various values
157+
delete(tree, 7)
158+
delete(tree, 5)
159+
delete(tree, 8)
160+
delete(tree, 3)
161+
162+
# Call printing methods
163+
print(f"PreOrder: {pre_order(tree)}")
164+
print(f"InOrder: {in_order(tree)}")
165+
print(f"PostOrder: {post_order(tree)}")
166+
167+
# Display the height of the tree after removing items
168+
print(f"Height: {tree_height(tree)}")

0 commit comments

Comments
 (0)