Introducció
Un arbre binari és una estructura de dades jeràrquica en la qual cada node té com a màxim dos fills, anomenats fill esquerre i fill dret. Els arbres binaris són fonamentals en la informàtica i s'utilitzen en una àmplia varietat d'aplicacions, com ara la cerca, l'ordenació i la representació d'expressions aritmètiques.
Característiques dels Arbres Binàries
- Node: Cada element de l'arbre.
- Arrel: El node superior de l'arbre.
- Fulla: Un node que no té fills.
- Subarbre: Un arbre format per un node i 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 de l'arrel fins a una fulla.
Tipus d'Arbres Binàries
- Arbre Binari Complet: Tots els nivells, excepte possiblement l'últim, estan completament plens, i tots els nodes estan tan a l'esquerra com sigui possible.
- Arbre Binari Perfecte: Tots els nivells estan completament plens.
- Arbre Binari Degenerat: Cada node té com a màxim un fill. Això fa que l'arbre es comporti com una llista enllaçada.
Operacions Bàsiques
Inserció
La inserció en un arbre binari segueix una sèrie de passos per assegurar que l'arbre es mantingui correcte. A continuació es mostra un exemple d'inserció en un arbre binari:
class Node: def __init__(self, key): self.left = None self.right = None self.val = key def insert(root, key): if root is None: return Node(key) else: if root.val < key: root.right = insert(root.right, key) else: root.left = insert(root.left, key) return root # Exemple d'ús root = Node(50) root = insert(root, 30) root = insert(root, 20) root = insert(root, 40) root = insert(root, 70) root = insert(root, 60) root = insert(root, 80)
Cerca
La cerca en un arbre binari implica recórrer l'arbre per trobar un node amb un valor específic. Aquí teniu un exemple de funció de cerca:
def search(root, key): if root is None or root.val == key: return root if root.val < key: return search(root.right, key) return search(root.left, key) # Exemple d'ús result = search(root, 40) if result: print("Node trobat:", result.val) else: print("Node no trobat")
Recorridos
Hi ha tres tipus principals de recorreguts en un arbre binari:
- Preordre: Visita el node arrel, després el subarbre esquerre i finalment el subarbre dret.
- Inordre: Visita el subarbre esquerre, després el node arrel i finalment el subarbre dret.
- Postordre: Visita el subarbre esquerre, després el subarbre dret i finalment el node arrel.
Exemple de recorreguts:
def preOrder(root): if root: print(root.val, end=' ') preOrder(root.left) preOrder(root.right) def inOrder(root): if root: inOrder(root.left) print(root.val, end=' ') inOrder(root.right) def postOrder(root): if root: postOrder(root.left) postOrder(root.right) print(root.val, end=' ') # Exemple d'ús print("Preordre:") preOrder(root) print("\nInordre:") inOrder(root) print("\nPostordre:") postOrder(root)
Exercici Pràctic
Exercici 1: Inserció i Cerca
- Implementa una funció per inserir nodes en un arbre binari.
- Implementa una funció per cercar un node en un arbre binari.
- Prova les funcions amb un conjunt de dades.
Solució
class Node: def __init__(self, key): self.left = None self.right = None self.val = key def insert(root, key): if root is None: return Node(key) else: if root.val < key: root.right = insert(root.right, key) else: root.left = insert(root.left, key) return root def search(root, key): if root is None or root.val == key: return root if root.val < key: return search(root.right, key) return search(root.left, key) # Exemple d'ús root = Node(50) root = insert(root, 30) root = insert(root, 20) root = insert(root, 40) root = insert(root, 70) root = insert(root, 60) root = insert(root, 80) result = search(root, 40) if result: print("Node trobat:", result.val) else: print("Node no trobat")
Conclusió
En aquesta secció, hem après sobre els arbres binaris, incloent-hi les seves característiques, tipus i operacions bàsiques com la inserció, la cerca i els recorreguts. Els arbres binaris són una estructura de dades fonamental que proporciona una base per a estructures més complexes com els arbres binaris de cerca i els arbres AVL. En el següent mòdul, explorarem els arbres binaris de cerca, que són una extensió dels arbres binaris amb propietats addicionals que faciliten la cerca eficient.
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