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

(算法基础——树)——python树结构使用指南

1. 树的定义与实现

树是一种非线性数据结构,常用于解决层次化数据问题(如路径搜索、二叉树遍历等)。以下是树的两种常见实现方式:

(1) 类(Class)实现
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val    # 节点值
        self.left = left  # 左子节点
        self.right = right # 右子节点
# 示例:构建一个简单的二叉树
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
(2) 字典实现(适合快速原型设计)
tree = {
    'val': 1,
    'left': {
        'val': 2,
        'left': {'val': 4, 'left': None, 'right': None},
        'right': None
    },
    'right': {'val': 3, 'left': None, 'right': None}
}

2. 树的遍历方法

树的遍历是解决树问题的核心,掌握以下三种遍历方式:

(1) 前序遍历(根-左-右)
def preorder(root):
    if not root:
        return []
    return [root.val] + preorder(root.left) + preorder(root.right)
# 示例输出:[1, 2, 4, 3]
(2) 中序遍历(左-根-右)
def inorder(root):
    if not root:
        return []
    return inorder(root.left) + [root.val] + inorder(root.right)
# 示例输出:[4, 2, 1, 3]
(3) 后序遍历(左-右-根)
def postorder(root):
    if not root:
        return []
    return postorder(root.left) + postorder(root.right) + [root.val]
# 示例输出:[4, 2, 3, 1]
(4) 层序遍历(BFS)
from collections import deque
def level_order(root):
    if not root:
        return []
    queue = deque([root])
    result = []
    while queue:
        level = []
        for _ in range(len(queue)):
            node = queue.popleft()
            level.append(node.val)
            if node.left:
                queue.append(node.left)
            if node.right:
                queue.append(node.right)
        result.append(level)
    return result
# 示例输出:[[1], [2, 3], [4]]

3. 常见题型与代码模板

以下题型在蓝桥杯中高频出现:

(1) 二叉树的最大深度
def max_depth(root):
    if not root:
        return 0
    return 1 + max(max_depth(root.left), max_depth(root.right))
(2) 路径总和(LeetCode 112)

判断是否存在根到叶子的路径和为给定值:

def has_path_sum(root, target):
    if not root:
        return False
    if not root.left and not root.right:
        return root.val == target
    return has_path_sum(root.left, target - root.val) or has_path_sum(root.right, target - root.val)
(3) 二叉树的镜像(反转二叉树)
def invert_tree(root):
    if not root:
        return None
    root.left, root.right = invert_tree(root.right), invert_tree(root.left)
    return root

4. 蓝桥杯高频技巧

  • 递归与迭代转换:递归代码简洁但可能栈溢出,需掌握迭代写法(如用栈模拟递归)。
  • 处理空节点:始终检查 if not root 避免空指针异常。
  • 路径记录:在遍历时通过参数传递路径列表(如 path + [root.val])。
  • 空间优化:某些问题可用Morris遍历实现O(1)空间复杂度。

5. 练习题推荐

  1. 二叉树的中序遍历(LeetCode 94)
  2. 对称二叉树(LeetCode 101)
  3. 从前序与中序遍历序列构造二叉树(LeetCode 105)
  4. 二叉树的最近公共祖先(LCA,LeetCode 236)

掌握以上内容后,可以覆盖蓝桥杯中80%的树相关题目!如果需要更具体的题目解析或优化技巧,请随时告诉我!

相关文章:

  • EM235 模块
  • xxl-job分布式调度平台
  • Java并发编程6--重排序
  • 动态规划 之 背包问题
  • 融合模型预测控制 (MPC) 的 RL 算法
  • 【产品推介】可驱动5A负载的降压型DC/DC转换器XBL1663
  • Jenkins同一个项目不同分支指定不同JAVA环境
  • 穷举 vs 暴搜 vs 深搜 vs 回溯 vs 剪枝
  • 基于Flask的广西高校舆情分析系统的设计与实现
  • 《Nuxt.js 实战:从放弃到入门》六、打造个性化文字转图片工具
  • 各类系统Pycharm安装教程
  • MongoDB between ... and ... 操作
  • Android嵌套滑动造成的滑动冲突原理分析
  • 解惑Python:一文解决osgeo库安装失败问题
  • DeepSeek + Vue实战开发
  • Python字符模糊匹配指南 RapidFuzz | python小知识
  • RocketMQ 5.0安装部署
  • Ubuntu 安装 OpenCV (C++)
  • 请解释设备像素、CSS 像素、设备独立像素、DPR、PPI 之间的区别 ?
  • 将图片base64编码后,数据转成图片
  • 网站建设方式有哪些/今日国内新闻头条
  • 行业网平台/seo教程免费
  • 制作网站的钱/哪里可以接广告
  • 帮别人做网站自己为什么会被抓/搜狗收录提交入口网址
  • 同方云罐网站设计/南宁做网站公司
  • wordpress电子书/东莞网络优化调查公司