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

Python 算法详解:二叉树(超详细完整版)

一、什么是二叉树?

1. 通俗理解

二叉树是树形数据结构,每个节点最多有两个子节点

  • 左孩子
  • 右孩子

像倒挂的树:根在上,叶子在下

2. 核心概念

  • 根节点(root):最顶层节点
  • 父节点:有子节点的节点
  • 叶子节点:没有子节点的节点
  • 左子树、右子树
  • 深度:树有多少层
  • 高度:从叶子往上数的层数

3. 二叉树节点结构(必须背会)

# 二叉树节点类
class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = val    # 节点值self.left = left  # 左孩子self.right = right # 右孩子

二、二叉树最核心:4 种遍历(面试必考)

二叉树最重要的就是遍历,分为 4 种:

  1. 前序遍历:根 → 左 → 右
  2. 中序遍历:左 → 根 → 右
  3. 后序遍历:左 → 右 → 根
  4. 层序遍历:一层一层遍历

三、前序遍历(根→左→右)

def preorder(root):res = []def dfs(node):if not node:returnres.append(node.val)  # 根dfs(node.left)        # 左dfs(node.right)       # 右dfs(root)return res

四、中序遍历(左→根→右)

def inorder(root):res = []def dfs(node):if not node:returndfs(node.left)        # 左res.append(node.val)  # 根dfs(node.right)       # 右dfs(root)return res

五、后序遍历(左→右→根)

def postorder(root):res = []def dfs(node):if not node:returndfs(node.left)        # 左dfs(node.right)       # 右res.append(node.val)  # 根dfs(root)return res

六、层序遍历(一层一层 BFS)

from collections import dequedef levelorder(root):res = []if not root:return resq = deque()q.append(root)while q:level = []size = len(q)for _ in range(size):node = q.popleft()level.append(node.val)if node.left:q.append(node.left)if node.right:q.append(node.right)res.append(level)return res

七、构建一棵二叉树(测试用)

# 构建如下树:
#      1
#       \
#        2
#       /
#      3
root = TreeNode(1)
root.right = TreeNode(2)
root.right.left = TreeNode(3)# 测试遍历
print("前序:", preorder(root))   # [1,2,3]
print("中序:", inorder(root))   # [1,3,2]
print("后序:", postorder(root)) # [3,2,1]
print("层序:", levelorder(root)) # [[1], [2], [3]]

八、二叉树高频经典算法(作业/面试必背)

1. 求二叉树最大深度

def max_depth(root):if not root:return 0left = max_depth(root.left)right = max_depth(root.right)return max(left, right) + 1

2. 判断是否是平衡二叉树

def is_balanced(root):def dfs(node):if not node:return 0left = dfs(node.left)right = dfs(node.right)if left == -1 or right == -1 or abs(left-right) > 1:return -1return max(left, right) + 1return dfs(root) != -1

3. 判断是否是对称二叉树

def is_symmetric(root):def check(left, right):if not left and not right:return Trueif not left or not right:return Falsereturn left.val == right.val and check(left.left, right.right) and check(left.right, right.left)return check(root.left, root.right)

4. 翻转二叉树(经典面试题)

def invert_tree(root):if not root:return None# 交换左右孩子root.left, root.right = root.right, root.leftinvert_tree(root.left)invert_tree(root.right)return root

5. 求所有根到叶子的路径

def binary_tree_paths(root):res = []def dfs(node, path):if not node:returnif not node.left and not node.right:res.append(path + str(node.val))returndfs(node.left, path + str(node.val) + "->")dfs(node.right, path + str(node.val) + "->")dfs(root, "")return res

九、完整整合代码(可直接交作业)

class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = right# 前序
def preorder(root):res = []def dfs(n):if not n: returnres.append(n.val)dfs(n.left)dfs(n.right)dfs(root)return res# 中序
def inorder(root):res = []def dfs(n):if not n: returndfs(n.left)res.append(n.val)dfs(n.right)dfs(root)return res# 后序
def postorder(root):res = []def dfs(n):if not n: returndfs(n.left)dfs(n.right)res.append(n.val)dfs(root)return res# 层序
from collections import deque
def levelorder(root):res = []if not root: return resq = deque([root])while q:level = []for _ in range(len(q)):n = q.popleft()level.append(n.val)if n.left: q.append(n.left)if n.right: q.append(n.right)res.append(level)return res# 最大深度
def max_depth(root):if not root: return 0return max(max_depth(root.left), max_depth(root.right)) + 1# 翻转二叉树
def invert(root):if not root: return Noneroot.left, root.right = root.right, root.leftinvert(root.left)invert(root.right)return root# 测试
if __name__ == "__main__":# 构建二叉树root = TreeNode(1)root.right = TreeNode(2)root.right.left = TreeNode(3)print("前序:", preorder(root))print("中序:", inorder(root))print("后序:", postorder(root))print("层序:", levelorder(root))print("最大深度:", max_depth(root))

十、二叉树核心总结

  1. 二叉树:每个节点最多两个孩子(左、右)
  2. 4 种遍历:前序、中序、后序(DFS)、层序(BFS)
  3. 前序:根→左→右
  4. 中序:左→根→右
  5. 后序:左→右→根
  6. 层序:用队列,一层一层遍历
  7. 高频考点:最大深度、翻转树、对称树、平衡树、路径

一句话记住:
二叉树 = 节点 + 两个孩子 + 4 种遍历 + 递归神器

http://www.jsqmd.com/news/603391/

相关文章:

  • G-Helper终极指南:解锁华硕笔记本隐藏性能的5个秘密功能
  • 开源虚拟打印机clawPDF:企业级PDF转换与OCR识别解决方案
  • 手把手教你用Vivado仿真验证:为什么FPGA设计推荐‘异步复位同步释放’?
  • 成人英语培训适合宝妈重返职场吗?2026三大品牌权威解析与选择指南 - 匠言榜单
  • 告别复杂配置!Fish Speech 1.5 开箱即用,3步搭建你的专属语音合成工具
  • bilibili-parse:解决B站视频解析难题的高效工具指南
  • 车载协议栈调试还在printf?(2024最新eBPF+Uprobe嵌入式追踪方案,支持ARMv8-A硬浮点环境)
  • 终极Visual Studio清理工具:彻底卸载VS释放磁盘空间的完整指南
  • BiliTools跨平台工具箱:一站式B站资源管理解决方案
  • 宣传海报设计要点与制作技巧全解析
  • 超越K因子:基于奈奎斯特判据的ADS高增益功放稳定性设计实践
  • 莱茵优品联系方式查询:探讨企业联系方式获取途径与信息核验的通用指南 - 品牌推荐
  • Akagi麻将AI助手:从零开始的智能分析与实战提升指南
  • Linux 基础超详细教程
  • GBase 8a 存储过程的执行身份与权限链风险
  • FPGA新手必看:PCI9054引脚定义详解与Verilog驱动代码实战
  • 实战从安装开始:基于快马生成ubuntu22.04服务器部署个人博客全流程
  • 【PyCon 2024闭门分享首发】:Python 3.14 JIT的4类不可缓存字节码模式与动态编译逃逸策略
  • 传统RAG核心流程;传统RAG数据准备阶段的数据切片策略(Chunking);传统RAG检索阶段的检索增强;代理式RAG与传统RAG;
  • Flutter网络请求实战:dio库高级封装与性能优化指南
  • 多头注意力MHA实战:用PyTorch复现Transformer核心模块(附性能对比)
  • 食品加工包装在线联系方式查询:一个垂直B2B平台如何为食品加工与包装行业提供商贸对接服务 - 品牌推荐
  • Android开发:Kotlin协程并发模型
  • 3个维度重构围棋AI分析:LizzieYzy智能分析工具全攻略
  • LongCat-Next:多模态AI的终极离散统一模型
  • 深入DeepFM:结合FM与DNN的PyTorch实现,如何高效处理Criteo的数值与类别特征?
  • FPGA实战:从原理到代码生成,手把手搞定CRC校验
  • Sigma-Delta ADC Matlab Model 集成实例与教程
  • 云原生环境中的大数据处理方案
  • 工业数据 vs. 传统资源:为什么数据才是未来的稀缺资产