Què és un Arbre?
Un arbre és una estructura de dades jeràrquica que consisteix en nodes connectats per arestes. Cada arbre té un node especial anomenat arrel, des del qual es poden accedir a tots els altres nodes. Els nodes poden tenir fills, que són altres nodes connectats a ells. Els nodes sense fills es diuen fulles.
Característiques d'un Arbre:
- Arrel (Root): El node superior de l'arbre.
- Node: Cada element de l'arbre.
- Fulla (Leaf): Un node que no té fills.
- Pare (Parent): Un node que té un o més fills.
- Fill (Child): Un node que té un pare.
- Subarbre: Un arbre format per un node i tots els seus descendents.
- Profunditat (Depth): La longitud del camí des de l'arrel fins a un node.
- Alçada (Height): La longitud del camí més llarg des d'un node fins a una fulla.
Terminologia Bàsica
Termini | Descripció |
---|---|
Arrel | El node inicial de l'arbre. |
Node | Un element de l'arbre. |
Fulla | Un node sense fills. |
Pare | Un node que té fills. |
Fill | Un node que té un pare. |
Subarbre | Un arbre format per un node i tots els seus descendents. |
Profunditat | La longitud del camí des de l'arrel fins a un node. |
Alçada | La longitud del camí més llarg des d'un node fins a una fulla. |
Tipus d'Arbres
Hi ha diversos tipus d'arbres, cadascun amb les seves pròpies característiques i aplicacions. Alguns dels més comuns són:
- Arbre Binari: Cada node té com a màxim dos fills.
- Arbre Binari de Cerca (BST): Un arbre binari on cada node segueix la propietat de l'ordre (els fills esquerres són menors i els fills drets són majors que el node pare).
- Arbre AVL: Un arbre binari de cerca autobalancejat.
- Arbre B: Un arbre balancejat utilitzat en bases de dades i sistemes de fitxers.
Representació d'un Arbre
Els arbres es poden representar de diverses maneres en la programació. Una de les formes més comunes és utilitzar nodes i referències. A continuació es mostra un exemple de com es podria representar un arbre binari en Python:
class Node: def __init__(self, key): self.left = None self.right = None self.value = key # Crear l'arrel root = Node(1) # Afegir nodes root.left = Node(2) root.right = Node(3) root.left.left = Node(4) root.left.right = Node(5)
En aquest exemple, hem creat un arbre binari amb una arrel i alguns nodes fills.
Operacions Bàsiques en Arbres
Les operacions més comunes que es poden realitzar en arbres inclouen:
- Inserció: Afegir un nou node a l'arbre.
- Eliminació: Eliminar un node existent de l'arbre.
- Cerca: Trobar un node amb un valor específic.
- Recorregut: Visitar tots els nodes de l'arbre en un ordre específic (preordre, inordre, postordre).
Exemple d'Inserció en un Arbre Binari de Cerca (BST)
class BSTNode: def __init__(self, key): self.left = None self.right = None self.value = key def insert(root, key): if root is None: return BSTNode(key) else: if root.value < key: root.right = insert(root.right, key) else: root.left = insert(root.left, key) return root # Crear l'arrel root = BSTNode(50) # Inserir nodes root = insert(root, 30) root = insert(root, 20) root = insert(root, 40) root = insert(root, 70) root = insert(root, 60) root = insert(root, 80)
En aquest exemple, hem creat un arbre binari de cerca i hem inserit diversos nodes seguint la propietat de l'ordre.
Exercici Pràctic
Exercici 1: Crear un Arbre Binari
Objectiu: Crear un arbre binari i implementar una funció per realitzar un recorregut en preordre.
Instruccions:
- Defineix una classe
Node
per representar els nodes de l'arbre. - Implementa una funció
preorder_traversal
que realitzi un recorregut en preordre de l'arbre.
class Node: def __init__(self, key): self.left = None self.right = None self.value = key def preorder_traversal(root): if root: print(root.value, end=" ") preorder_traversal(root.left) preorder_traversal(root.right) # Crear l'arrel root = Node(1) # Afegir nodes root.left = Node(2) root.right = Node(3) root.left.left = Node(4) root.left.right = Node(5) # Realitzar el recorregut en preordre preorder_traversal(root)
Solució:
class Node: def __init__(self, key): self.left = None self.right = None self.value = key def preorder_traversal(root): if root: print(root.value, end=" ") preorder_traversal(root.left) preorder_traversal(root.right) # Crear l'arrel root = Node(1) # Afegir nodes root.left = Node(2) root.right = Node(3) root.left.left = Node(4) root.left.right = Node(5) # Realitzar el recorregut en preordre preorder_traversal(root)
Conclusió
En aquesta secció, hem introduït els conceptes bàsics dels arbres, incloent-hi la seva terminologia, tipus i operacions bàsiques. També hem vist com es poden representar i manipular arbres en Python. En els següents mòduls, aprofundirem en tipus específics d'arbres i les seves aplicacions.
Curs d'Estructures de Dades
Mòdul 1: Introducció a les Estructures de Dades
- Què són les Estructures de Dades?
- Importància de les Estructures de Dades en la Programació
- Tipus d'Estructures de Dades
Mòdul 2: Llistes
- Introducció a les Llistes
- Llistes Enllaçades
- Llistes Doblement Enllaçades
- Llistes Circulars
- Exercicis amb Llistes
Mòdul 3: Piles
- Introducció a les Piles
- Operacions Bàsiques amb Piles
- Implementació de Piles
- Aplicacions de les Piles
- Exercicis amb Piles
Mòdul 4: Cues
- Introducció a les Cues
- Operacions Bàsiques amb Cues
- Cues Circulars
- Cues de Prioritat
- Exercicis amb Cues
Mòdul 5: Arbres
- Introducció als Arbres
- Arbres Binàries
- Arbres Binàries de Cerca
- Arbres AVL
- Arbres B
- Exercicis amb Arbres
Mòdul 6: Grafs
- Introducció als Grafs
- Representació de Grafs
- Algoritmes de Cerca en Grafs
- Algoritmes de Camins Mínims
- Aplicacions dels Grafs
- Exercicis amb Grafs