-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathArvore.Binaria.py
178 lines (148 loc) · 5.08 KB
/
Arvore.Binaria.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
class No:
def __init__(self, valor):
self.valor = valor
self.esquerda = None
self.direita = None
def mostrar_no(self):
print(self.valor)
class ArvoreBinaria:
def __init__(self):
self.raiz = None
def inserir(self, valor):
novo = No(valor)
if self.raiz is None: # se a árvore estiver vazia
self.raiz = novo
return
atual = self.raiz
while True:
pai = atual
if valor < atual.valor: # esquerda
atual = atual.esquerda
if atual is None:
pai.esquerda = novo
return
else: # direita
atual = atual.direita
if atual is None:
pai.direita = novo
return
def pesquisar_valor(self, valor):
atual = self.raiz
while atual is not None:
if atual.valor == valor:
return atual
elif valor < atual.valor:
atual = atual.esquerda
else:
atual = atual.direita
return None
def pre_ordem(self, no): # raiz, esquerda, direita
if no is not None:
print(no.valor)
self.pre_ordem(no.esquerda)
self.pre_ordem(no.direita)
def em_ordem(self, no): # esquerda, raiz, direita
if no is not None:
self.em_ordem(no.esquerda)
print(no.valor)
self.em_ordem(no.direita)
def pos_ordem(self, no): # esquerda, direita, raiz
if no is not None:
self.pos_ordem(no.esquerda)
self.pos_ordem(no.direita)
print(no.valor)
def excluir_no(self, valor):
if self.raiz is None:
print("Árvore binária vazia!")
return
# Encontrar nó
atual = self.raiz
pai = None
e_esquerda = True
while atual is not None and atual.valor != valor:
pai = atual
if valor < atual.valor:
e_esquerda = True
atual = atual.esquerda
else:
e_esquerda = False
atual = atual.direita
if atual is None:
return False # O nó não foi encontrado
# Caso 1: nó a ser excluído é uma folha
if atual.esquerda is None and atual.direita is None:
if atual == self.raiz:
self.raiz = None
elif e_esquerda:
pai.esquerda = None
else:
pai.direita = None
# Caso 2: nó a ser excluído tem apenas filho à esquerda
elif atual.direita is None:
if atual == self.raiz:
self.raiz = atual.esquerda
elif e_esquerda:
pai.esquerda = atual.esquerda
else:
pai.direita = atual.esquerda
# Caso 3: nó a ser excluído tem apenas filho à direita
elif atual.esquerda is None:
if atual == self.raiz:
self.raiz = atual.direita
elif e_esquerda:
pai.esquerda = atual.direita
else:
pai.direita = atual.direita
# Caso 4: nó a ser excluído tem dois filhos
else:
sucessor = self.get_sucessor(atual)
if atual == self.raiz:
self.raiz = sucessor
elif e_esquerda:
pai.esquerda = sucessor
else:
pai.direita = sucessor
sucessor.esquerda = atual.esquerda
return True
def get_sucessor(self, no):
pai_sucessor = no
sucessor = no
atual = no.direita
while atual is not None:
pai_sucessor = sucessor
sucessor = atual
atual = atual.esquerda
# Ajuste no ponteiro do pai do sucessor
if sucessor != no.direita:
pai_sucessor.esquerda = sucessor.direita
sucessor.direita = no.direita
return sucessor
# Criar uma instância da árvore binária
arvore = ArvoreBinaria()
# Inserir valores
arvore.inserir(50)
arvore.inserir(30)
arvore.inserir(70)
arvore.inserir(20)
arvore.inserir(40)
arvore.inserir(60)
arvore.inserir(80)
# Exibir em ordem
print("Em ordem:")
arvore.em_ordem(arvore.raiz)
# Pesquisar um valor
valor_pesquisar = 40
no_encontrado = arvore.pesquisar_valor(valor_pesquisar)
print(f"\nPesquisar {valor_pesquisar}: {'Encontrado' if no_encontrado else 'Não encontrado'}")
# Excluir um nó (folha)
arvore.excluir_no(20)
print("\nApós excluir 20 (folha):")
arvore.em_ordem(arvore.raiz)
# Excluir um nó (com um filho)
arvore.excluir_no(30)
print("\nApós excluir 30 (com um filho):")
arvore.em_ordem(arvore.raiz)
# Excluir um nó (com dois filhos)
arvore.excluir_no(50)
print("\nApós excluir 50 (com dois filhos):")
arvore.em_ordem(arvore.raiz)