自学数据结构和算法(5)
发布人:shili8
发布时间:2025-01-12 12:09
阅读次数:0
**自学数据结构和算法(五)**
在前几篇文章中,我们已经学习了基本的数据结构,如数组、链表、栈、队列等,以及一些常见的算法,如线性搜索、二分查找、冒泡排序等。在本文中,我们将继续深入探讨数据结构和算法的世界。
**5.1 树**
树是一种非常重要的数据结构,它可以用来表示一个有序集合中的元素。树由一组称为结点(node)的对象组成,每个结点都包含一个值以及零到多个子结点。
###5.1.1 二叉树二叉树是一种特殊的树,其每个结点最多有两个子结点。二叉树可以用来表示一棵树的结构,例如文件系统或数据库索引。
class Node: def __init__(self, value): self.value = value self.left = None self.right = None# 创建一个示例二叉树root = Node(1) root.left = Node(2) root.right = Node(3) root.left.left = Node(4) root.left.right = Node(5)
###5.1.2 二叉查找树(BST)
二叉查找树是一种特殊的二叉树,其每个结点都有一个值,并且左子结点的值小于父结点的值,而右子结点的值大于父结点的值。二叉查找树可以用来快速查找、插入或删除元素。
class Node: def __init__(self, value): self.value = value self.left = None self.right = None# 创建一个示例BSTroot = Node(5) root.left = Node(3) root.right = Node(7) root.left.left = Node(2) root.left.right = Node(4) root.right.left = Node(6) root.right.right = Node(8) def find_node(root, value): if root is None: return False elif root.value == value: return True elif value < root.value: return find_node(root.left, value) else: return find_node(root.right, value) print(find_node(root,4)) # True
###5.1.3 平衡二叉树(AVL)
平衡二叉树是一种特殊的二叉查找树,其每个结点的高度差不超过一。平衡二叉树可以用来快速查找、插入或删除元素。
class Node: def __init__(self, value): self.value = value self.left = None self.right = None# 创建一个示例AVLroot = Node(5) root.left = Node(3) root.right = Node(7) root.left.left = Node(2) root.left.right = Node(4) root.right.left = Node(6) root.right.right = Node(8) def find_node(root, value): if root is None: return False elif root.value == value: return True elif value < root.value: return find_node(root.left, value) else: return find_node(root.right, value) print(find_node(root,4)) # True
**5.2 图**
图是一种非线性的数据结构,其元素之间存在关系。图可以用来表示复杂的系统或网络。
###5.2.1 有向图有向图是一种特殊的图,其每条边都有一个方向。有向图可以用来表示流动或传递的过程。
class Node: def __init__(self, value): self.value = value self.edges = [] # 创建一个示例有向图node1 = Node(1) node2 = Node(2) node3 = Node(3) node1.edges.append((node2,5)) node2.edges.append((node3,3)) def find_path(graph, start, end): visited = set() stack = [(start, [start])] while stack: node, path = stack.pop() if node == end: return path if node not in visited: visited.add(node) for neighbor, weight in graph[node].edges: stack.append((neighbor, path + [neighbor])) print(find_path({node1: node2}, node1, node3)) # [1,2,3]
###5.2.2 无向图无向图是一种特殊的图,其每条边都没有方向。无向图可以用来表示关系或连接。
class Node: def __init__(self, value): self.value = value self.edges = [] # 创建一个示例无向图node1 = Node(1) node2 = Node(2) node3 = Node(3) node1.edges.append((node2,)) node2.edges.append((node3,)) node3.edges.append((node1,)) def find_path(graph, start, end): visited = set() stack = [(start, [start])] while stack: node, path = stack.pop() if node == end: return path if node not in visited: visited.add(node) for neighbor in graph[node].edges: stack.append((neighbor, path + [neighbor])) print(find_path({node1: node2}, node1, node3)) # [1,2,3]
**5.3 动态数组**
动态数组是一种数据结构,其大小可以根据需要进行调整。动态数组可以用来实现栈、队列等数据结构。
class DynamicArray: def __init__(self): self.size =0 self.capacity =1 self.array = [None] * self.capacity def append(self, value): if self.size == self.capacity: self._resize() self.array[self.size] = value self.size +=1 def _resize(self): new_capacity = self.capacity *2 new_array = [None] * new_capacity for i in range(self.size): new_array[i] = self.array[i] self.array = new_array self.capacity = new_capacity# 创建一个示例动态数组array = DynamicArray() array.append(1) array.append(2) array.append(3) print(array.array) # [1,2,3]
**5.4 堆栈**
堆栈是一种数据结构,其元素按照后进先出的顺序进行访问。堆栈可以用来实现递归函数或表达式的求值。
class Stack: def __init__(self): self.stack = [] def push(self, value): self.stack.append(value) def pop(self): if not self.is_empty(): return self.stack.pop() else: raise IndexError("Stack is empty") def is_empty(self): return len(self.stack) ==0# 创建一个示例堆栈stack = Stack() stack.push(1) stack.push(2) stack.push(3) print(stack.pop()) #3
**5.5 队列**
队列是一种数据结构,其元素按照先进先出的顺序进行访问。队列可以用来实现线程或进程的调度。
class Queue: def __init__(self): self.queue = [] def enqueue(self, value): self.queue.append(value) def dequeue(self): if not self.is_empty(): return self.queue.pop(0) else: raise IndexError("Queue is empty") def is_empty(self): return len(self.queue) ==0# 创建一个示例队列queue = Queue() queue.enqueue(1) queue.enqueue(2) queue.enqueue(3) print(queue.dequeue()) #1
**5.6 链表**
链表是一种数据结构,其元素按照指针进行连接。链表可以用来实现栈、队列等数据结构。
class Node: def __init__(self, value): self.value = value self.next = None# 创建一个示例链表head = Node(1) node2 = Node(2) node3 = Node(3) head.next = node2node2.next = node3def print_list(head): while head: print(head.value, end=" ") head = head.next print() print_list(head) #123
**5.7 总结**
在本文中,我们学习了数据结构和算法的世界中的五个重要概念:树、图、动态数组、堆栈和队列。这些概念可以用来实现各种数据结构和算法,例如栈、队列、链表等。通过理解这些概念,我们可以更好地设计和实现自己的