当前位置: 首页 > news >正文

算法(③二叉树)

遍历算法

TreeNode 类:

class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = right

创建节点

# 创建节点
root = TreeNode(1)
node2 = TreeNode(2)
node3 = TreeNode(3)
node4 = TreeNode(4)
node5 = TreeNode(5)# 连接节点
root.left = node2
root.right = node3
node2.left = node4
node2.right = node5

前序遍历 (Pre-order Traversal)

def preorder_traversal(root):if root is None:return []result = []result.append(root.val)  # 访问根节点result.extend(preorder_traversal(root.left)) # 递归访问左子树result.extend(preorder_traversal(root.right)) # 递归访问右子树return result# 假设我们已经创建了上面那棵树
# preorder_traversal(root) 的结果将是 [1, 2, 4, 5, 3]

中序遍历 (In-order Traversal)

def inorder_traversal(root):if root is None:return []result = []result.extend(inorder_traversal(root.left)) # 递归访问左子树result.append(root.val)  # 访问根节点result.extend(inorder_traversal(root.right)) # 递归访问右子树return result# inorder_traversal(root) 的结果将是 [4, 2, 5, 1, 3]

后序遍历 (Post-order Traversal)

def postorder_traversal(root):if root is None:return []result = []result.extend(postorder_traversal(root.left)) # 递归访问左子树result.extend(postorder_traversal(root.right)) # 递归访问右子树result.append(root.val)  # 访问根节点return result# postorder_traversal(root) 的结果将是 [4, 5, 2, 3, 1]

二叉搜索树

前置条件:节点类

我们继续使用之前定义的 TreeNode 类:

class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = right

插入节点 (Insertion)

def insert_into_bst(root, val):"""在二叉搜索树中插入一个新节点:param root: 当前子树的根节点:param val: 要插入的值:return: 插入新节点后的根节点"""# 递归终止条件:如果当前节点为空,说明找到了插入位置,创建新节点并返回if not root:return TreeNode(val)# 如果要插入的值小于当前节点的值,向左子树递归if val < root.val:root.left = insert_into_bst(root.left, val)# 如果要插入的值大于当前节点的值,向右子树递归elif val > root.val:root.right = insert_into_bst(root.right, val)# 返回当前根节点,因为它的子树可能已经改变return root# 示例:在 BST 中插入 7
# 初始 BST:
#      4
#     / \
#    2   7
#   / \
#  1   3
root = TreeNode(4)
root.left = TreeNode(2, TreeNode(1), TreeNode(3))
root.right = TreeNode(7)print("插入前的二叉搜索树(前序遍历):", end=" ")
def preorder(node):if node:print(node.val, end=" ")preorder(node.left)preorder(node.right)
preorder(root)
print()root = insert_into_bst(root, 5) # 插入 5print("插入 5 后的二叉搜索树(前序遍历):", end=" ")
preorder(root)
print()

删除节点 (Deletion)

def delete_node(root, key):"""在二叉搜索树中删除一个节点:param root: 当前子树的根节点:param key: 要删除的值:return: 删除节点后的根节点"""if not root:return root# 1. 查找要删除的节点if key < root.val:root.left = delete_node(root.left, key)elif key > root.val:root.right = delete_node(root.right, key)# 2. 找到要删除的节点(root.val == key)else:# 情况 1 和 2:节点只有一个子节点或没有子节点if not root.left:return root.rightelif not root.right:return root.left# 情况 3:节点有两个子节点# 找到中序遍历的后继节点(右子树中最小的节点)temp_node = find_min_node(root.right)# 用后继节点的值替换当前节点的值root.val = temp_node.val# 递归地删除后继节点root.right = delete_node(root.right, temp_node.val)return rootdef find_min_node(node):"""辅助函数:找到子树中的最小节点"""current = nodewhile current.left:current = current.leftreturn current# 示例:删除节点 4
# 初始 BST:
#      5
#     / \
#    3   6
#   / \   \
#  2   4   7
root = TreeNode(5)
root.left = TreeNode(3, TreeNode(2), TreeNode(4))
root.right = TreeNode(6, None, TreeNode(7))print("删除 4 前的二叉搜索树(前序遍历):", end=" ")
preorder(root)
print()root = delete_node(root, 4) # 删除 4print("删除 4 后的二叉搜索树(前序遍历):", end=" ")
preorder(root)
print()# 示例:删除节点 5(有两个子节点)
# 初始 BST:
#      5
#     / \
#    3   6
#   / \   \
#  2   4   7
root = TreeNode(5)
root.left = TreeNode(3, TreeNode(2), TreeNode(4))
root.right = TreeNode(6, None, TreeNode(7))print("删除 5 前的二叉搜索树(前序遍历):", end=" ")
preorder(root)
print()root = delete_node(root, 5) # 删除 5print("删除 5 后的二叉搜索树(前序遍历):", end=" ")
preorder(root)
print()

AVL 树

红黑树

平衡二叉树

对称二叉树

树的深度/高度

路径总和

http://www.dtcms.com/a/358098.html

相关文章:

  • 精简版UDP网络编程:Socket套接字应用
  • 网格纹理采样算法
  • U盘/移动硬盘里可清理的那些跨系统遗留文件
  • 使用JAVA制作minecraft红石和创造模式插件
  • 理解JVM
  • 蓝牙5.3核心技术架构解析:从控制器到主机的无线通信设计
  • 广东省省考备考(第九十天8.30)——判断推理(强化训练)
  • 项目管理的五个阶段是什么
  • 在线简历生成工具,免费好用
  • 【MLLM】从BLIP3o到BLIP3o-NEXT:统一生成与理解
  • 【Docker】Docker初识
  • AI工具营销落地方案:工业产品营销
  • python pyqt5开发DoIP上位机【诊断回复的函数都是怎么调用的?】
  • 计算机毕设 java 阿歹果园养鸡场管理系统 基于 SSM 框架的果园养鸡场全流程管理系统设计与实现 Java+MySQL 的养殖生产与进销存一体化平台开发
  • SQLSugar 封装原理详解:从架构到核心模块的底层实现
  • uniapp解析富文本,视频无法显示问题
  • HTTP的概念、原理、工作机制、数据格式和REST
  • 卫星信号和无线信号的设备厂商
  • Linux(1)|入门的开始:Linux基本指令
  • 【C++】C++ const成员函数与取地址操作符重载
  • 数据结构 03(线性:单链表)
  • 强化学习-CH6 随机近似
  • Ansible 核心运维场景落地:YUM 仓库、SSH 公钥、固定 IP 配置技巧
  • 2025年9月计算机二级C++语言程序设计——选择题打卡Day11
  • 如何取得专案/设计/设定/物件的属性
  • mysql权限user表赋权操作修改
  • 《潮汐调和分析原理和应用》之四S_Tide使用2
  • 整体设计 的语言设计:通用模型语言的标准模板语言的规格模式语言(搜狗汪仔答问)
  • 【计算机网络】生产问题排查:如何使用Wireshark抓包/读取抓包文件进行网络分析
  • 使用AI大模型Seed1.5-VL精准识别开车接打电话等交通违法行为