Python - Algoritmos de árvore transversal
Traversal é um processo para visitar todos os nós de uma árvore e pode imprimir seus valores também. Porque, todos os nós são conectados por meio de arestas (links), sempre começamos a partir do nó raiz (cabeça). Ou seja, não podemos acessar aleatoriamente um nó em uma árvore. Existem três maneiras que usamos para atravessar uma árvore -
- Transversal em ordem
- Pré-encomendar Traversal
- Traversal pós-pedido
Transversal em ordem
Neste método transversal, a subárvore esquerda é visitada primeiro, então a raiz e depois a subárvore direita. Devemos sempre lembrar que cada nó pode representar uma subárvore em si.
No programa python abaixo, usamos a classe Node para criar espaços reservados para o nó raiz, bem como os nós esquerdo e direito. Em seguida, criamos uma função de inserção para adicionar dados à árvore. Finalmente, a lógica de travessia Inorder é implementada criando uma lista vazia e adicionando o nó esquerdo primeiro, seguido pelo nó raiz ou pai. Por fim, o nó esquerdo é adicionado para completar a travessia da ordem. Observe que este processo é repetido para cada subárvore até que todos os nós sejam percorridos.
class Node:
def __init__(self, data):
self.left = None
self.right = None
self.data = data
# Insert Node
def insert(self, data):
if self.data:
if data < self.data:
if self.left is None:
self.left = Node(data)
else:
self.left.insert(data)
elif data > self.data:
if self.right is None:
self.right = Node(data)
else:
self.right.insert(data)
else:
self.data = data
# Print the Tree
def PrintTree(self):
if self.left:
self.left.PrintTree()
print( self.data),
if self.right:
self.right.PrintTree()
# Inorder traversal
# Left -> Root -> Right
def inorderTraversal(self, root):
res = []
if root:
res = self.inorderTraversal(root.left)
res.append(root.data)
res = res + self.inorderTraversal(root.right)
return res
root = Node(27)
root.insert(14)
root.insert(35)
root.insert(10)
root.insert(19)
root.insert(31)
root.insert(42)
print(root.inorderTraversal(root))
Quando o código acima é executado, ele produz o seguinte resultado -
[10, 14, 19, 27, 31, 35, 42]
Pré-encomendar Traversal
Nesse método de passagem, o nó raiz é visitado primeiro, depois a subárvore esquerda e, finalmente, a subárvore direita.
No programa python abaixo, usamos a classe Node para criar espaços reservados para o nó raiz, bem como os nós esquerdo e direito. Em seguida, criamos uma função de inserção para adicionar dados à árvore. Finalmente, a lógica de passagem de pré-pedido é implementada criando uma lista vazia e adicionando o nó raiz primeiro, seguido pelo nó esquerdo. Por fim, o nó certo é adicionado para completar a travessia da pré-encomenda. Observe que este processo é repetido para cada subárvore até que todos os nós sejam percorridos.
class Node:
def __init__(self, data):
self.left = None
self.right = None
self.data = data
# Insert Node
def insert(self, data):
if self.data:
if data < self.data:
if self.left is None:
self.left = Node(data)
else:
self.left.insert(data)
elif data > self.data:
if self.right is None:
self.right = Node(data)
else:
self.right.insert(data)
else:
self.data = data
# Print the Tree
def PrintTree(self):
if self.left:
self.left.PrintTree()
print( self.data),
if self.right:
self.right.PrintTree()
# Preorder traversal
# Root -> Left ->Right
def PreorderTraversal(self, root):
res = []
if root:
res.append(root.data)
res = res + self.PreorderTraversal(root.left)
res = res + self.PreorderTraversal(root.right)
return res
root = Node(27)
root.insert(14)
root.insert(35)
root.insert(10)
root.insert(19)
root.insert(31)
root.insert(42)
print(root.PreorderTraversal(root))
Quando o código acima é executado, ele produz o seguinte resultado -
[27, 14, 10, 19, 35, 31, 42]
Traversal pós-pedido
Neste método de passagem, o nó raiz é visitado por último, daí o nome. Primeiro, percorremos a subárvore esquerda, depois a subárvore direita e, finalmente, o nó raiz.
No programa python abaixo, usamos a classe Node para criar espaços reservados para o nó raiz, bem como os nós esquerdo e direito. Em seguida, criamos uma função de inserção para adicionar dados à árvore. Finalmente, a lógica de travessia pós-pedido é implementada criando uma lista vazia e adicionando o nó esquerdo primeiro seguido pelo nó direito. Por fim, o nó raiz ou pai é adicionado para completar a travessia pós-pedido. Observe que este processo é repetido para cada subárvore até que todos os nós sejam percorridos.
class Node:
def __init__(self, data):
self.left = None
self.right = None
self.data = data
# Insert Node
def insert(self, data):
if self.data:
if data < self.data:
if self.left is None:
self.left = Node(data)
else:
self.left.insert(data)
elif data > self.data:
if self.right is None:
self.right = Node(data)
else:
self.right.insert(data)
else:
self.data = data
# Print the Tree
def PrintTree(self):
if self.left:
self.left.PrintTree()
print( self.data),
if self.right:
self.right.PrintTree()
# Postorder traversal
# Left ->Right -> Root
def PostorderTraversal(self, root):
res = []
if root:
res = self.PostorderTraversal(root.left)
res = res + self.PostorderTraversal(root.right)
res.append(root.data)
return res
root = Node(27)
root.insert(14)
root.insert(35)
root.insert(10)
root.insert(19)
root.insert(31)
root.insert(42)
print(root.PostorderTraversal(root))
Quando o código acima é executado, ele produz o seguinte resultado -
[10, 19, 14, 31, 42, 35, 27]