当前位置:   article > 正文

Python中的数据结构

Python中的数据结构

一.堆

堆的建立可以通过导入heapq库来实现

在Python中建立的是最小堆 即heap[k]<=heap[2*k+1]and heap[k]<=heap[2*k+2]

下面是一些 堆使用的方法

heapq.heappush([],加入的元素)   
heapq.heappop(heap)弹出最小的元素  
heapq.nlargest(3,heap)返回最大的三个元素 
heapq.nsmallest(3,heap)返回最小的三个元素  
heapq.heapify(my)  #自动将列表装换成堆

例子:

  1. import heapq ,random
  2. data=list(range(10))
  3. random.shuffle(data)
  4. print(data)
  5. #建堆
  6. heap=[]
  7. for i in data:
  8. heapq.heappush(heap,i)
  9. heapq.heappush(heap,99)#添加元素99
  10. print(heap)
  11. print(heapq.heappop(heap)) #弹出最小的元素
  12. heapq.heapreplace(heap,3)#替换堆中最小的元素值,并自动重新建堆
  13. print(heapq.nlargest(3,heap)) #返回最大的三个元素
  14. print(heapq.nsmallest(3,heap)) #返回最小的三个元素
  15. my=[2,0,4,3,12,15,5]
  16. heapq.heapify(my) #自动将列表装换成堆
  17. print(my)

二.队列

通过导入queue模块实现

下面是一些 队列使用的方法

q=queue.Queue(6) #实例化队列   
q.put(1)  #元素入队  
q.get()出队 
q.empty()判断队列是否为空
q.full()判断队列是否为满
  1. import queue
  2. q=queue.Queue(6) #实例化队列
  3. q.put(1) #元素入队
  4. q.put(3)
  5. q.put(10)
  6. print(q.full())
  7. print(q.get())

3.链表

可以通过列表来模拟.不过多讲解

4.二叉树

自己实现

  1. class TreeNode:
  2. def __init__(self, key):
  3. self.key = key
  4. self.left = None
  5. self.right = None
  6. class BinaryTree:
  7. def __init__(self):
  8. self.root = None
  9. def insert(self, key):
  10. if self.root is None:
  11. self.root = TreeNode(key)
  12. else:
  13. self._insert_recursive(self.root, key)
  14. def _insert_recursive(self, current_node, key):
  15. if key < current_node.key:
  16. if current_node.left is None:
  17. current_node.left = TreeNode(key)
  18. else:
  19. self._insert_recursive(current_node.left, key)
  20. else:
  21. if current_node.right is None:
  22. current_node.right = TreeNode(key)
  23. else:
  24. self._insert_recursive(current_node.right, key)
  25. def search(self, key):
  26. return self._search_recursive(self.root, key)
  27. def _search_recursive(self, current_node, key):
  28. if current_node is None or current_node.key == key:
  29. return current_node
  30. elif key < current_node.key:
  31. return self._search_recursive(current_node.left, key)
  32. else:
  33. return self._search_recursive(current_node.right, key)
  34. def inorder_traversal(self):
  35. return self._inorder_recursive(self.root)
  36. def _inorder_recursive(self, current_node):
  37. result = []
  38. if current_node:
  39. result.extend(self._inorder_recursive(current_node.left))
  40. result.append(current_node.key)
  41. result.extend(self._inorder_recursive(current_node.right))
  42. return result
  43. # 使用示例
  44. tree = BinaryTree()
  45. tree.insert(5)
  46. tree.insert(3)
  47. tree.insert(7)
  48. tree.insert(2)
  49. tree.insert(4)
  50. tree.insert(6)
  51. tree.insert(8)
  52. print(tree.inorder_traversal()) # 输出:[2, 3, 4, 5, 6, 7, 8]
  53. # 搜索示例
  54. result = tree.search(4)
  55. if result:
  56. print(f"Key 4 found: {result.key}")
  57. else:
  58. print("Key 4 not found")

实现说明:

  1. TreeNode类

    • 表示二叉树中的每个节点,具有一个 key 属性存储节点的值,以及 left 和 right 属性分别指向左子节点和右子节点。
  2. BinaryTree类

    • 使用 root 属性表示树的根节点。
    • insert(key) 方法用于插入新的节点到二叉树中。
    • _insert_recursive(current_node, key) 是递归插入方法,根据节点值大小决定向左子树或右子树插入新节点。
    • search(key) 方法用于搜索特定值的节点。
    • _search_recursive(current_node, key) 是递归搜索方法,根据节点值大小在左子树或右子树中搜索目标节点。
    • inorder_traversal() 方法实现中序遍历,返回一个按升序排列的节点值列表。
    • _inorder_recursive(current_node) 是递归实现的中序遍历方法。
  3. 使用示例

    • 创建一个二叉搜索树(BST),插入一些节点并进行搜索和遍历操作。
    • 输出示例展示了中序遍历的结果,以及如何搜索特定的节点。

这是一个基本的二叉树实现,可以根据需要扩展添加其他操作如删除节点、前序遍历、后序遍历等。

当我们对一个简单的二叉搜索树进行中序遍历时,可以通过以下步骤演示 _inorder_recursive() 方法的执行过程 

初始调用

首先,我们从根节点 5 开始调用 _inorder_recursive() 方法:

  1. 调用 _inorder_recursive(5)

    • current_node 是 5
    • result 初始化为空列表 []
  2. 处理左子树 _inorder_recursive(3)

    • current_node 是 3
    • 调用 _inorder_recursive(3)
  3. 处理左子树 _inorder_recursive(2)

    • current_node 是 2
    • 调用 _inorder_recursive(2)
  4. 返回空列表 [2]_inorder_recursive(3)

    • 现在 result 是 [2]
    • 添加 3,返回 [2, 3] 到 _inorder_recursive(5)
  5. 处理根节点 5

    • 现在 result 是 [2, 3]
    • 添加 5,成为 [2, 3, 5]
  6. 处理右子树 _inorder_recursive(7)

    • current_node 是 7
    • 调用 _inorder_recursive(7)
  7. 处理左子树 _inorder_recursive(6)

    • current_node 是 6
    • 调用 _inorder_recursive(6)
  8. 返回空列表 [6]_inorder_recursive(7)

    • 现在 result 是 [6]
    • 添加 7,返回 [6, 7] 到 _inorder_recursive(5)
  9. 处理根节点 5

    • 现在 result 是 [2, 3, 5, 6, 7]
  10. 处理右子树 8

    • current_node 是 8
    • 调用 _inorder_recursive(8)
  11. 返回空列表 [8]_inorder_recursive(7)

    • 现在 result 是 [6, 7, 8]
    • 返回 [2, 3, 5, 6, 7, 8] 到 _inorder_recursive(5)
  12. 最终结果

    • 最终返回 [2, 3, 4, 5, 6, 7, 8],这是二叉搜索树中序遍历的结果。

5.有向图

  1. from collections import defaultdict
  2. class WeightedGraph:
  3. def __init__(self):
  4. self.graph = defaultdict(list)
  5. def add_edge(self, u, v, weight):
  6. self.graph[u].append((v, weight))
  7. # Uncomment below for undirected graph
  8. # self.graph[v].append((u, weight))
  9. def print_graph(self):
  10. for node in self.graph:
  11. print(f"{node} -> {self.graph[node]}")
  12. # 创建一个新的带权图实例
  13. graph = WeightedGraph()
  14. # 添加带权边
  15. graph.add_edge(0, 1, 4)
  16. graph.add_edge(0, 2, 2)
  17. graph.add_edge(1, 3, 1)
  18. graph.add_edge(2, 3, 3)
  19. # 打印邻接表表示的带权图
  20. graph.print_graph()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/776062
推荐阅读
相关标签
  

闽ICP备14008679号