|
5 | 5 | """ |
6 | 6 |
|
7 | 7 |
|
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) |
25 | 25 | else: |
26 | | - busca_recursiva(no.esquerda, chave) |
| 26 | + return recursive_search(node.left, key) |
27 | 27 |
|
28 | 28 |
|
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 |
35 | 35 | else: |
36 | | - no = no.esquerda |
| 36 | + node = node.left |
37 | 37 | return None |
38 | 38 |
|
39 | 39 |
|
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) |
44 | 44 | 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) |
47 | 47 | 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: |
92 | 85 | 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 |
105 | 98 | else: |
106 | | - no = no.esquerda |
107 | | - return no_pai |
| 99 | + node = node.left |
| 100 | + return parent_node |
108 | 101 |
|
109 | 102 |
|
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 |
115 | 108 |
|
116 | 109 |
|
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: |
120 | 113 | 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 |
125 | 118 | 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 |
131 | 124 | else: |
132 | | - noPai.esquerda = substituto |
133 | | - # AQUI DA FREE(ATUAL) |
| 125 | + parent.left = substitute |
134 | 126 | 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 |
139 | 131 | else: |
140 | | - atual.esquerda = None |
141 | | - # FREE(substituto) |
| 132 | + current.left = None |
142 | 133 | return True |
143 | 134 |
|
144 | 135 |
|
145 | 136 | 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") |
161 | 151 | 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