当前位置:实例文章 » 其他实例» [文章]自学数据结构和算法(5)

自学数据结构和算法(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 总结**

在本文中,我们学习了数据结构和算法的世界中的五个重要概念:树、图、动态数组、堆栈和队列。这些概念可以用来实现各种数据结构和算法,例如栈、队列、链表等。通过理解这些概念,我们可以更好地设计和实现自己的

其他信息

其他资源

Top