数据结构:二叉树

一、核心定义

二叉树是n(n≥0)个节点的有限集合,每个节点最多有两个子节点,分别称为左子树右子树,且子树有明确的左右顺序(不可交换)。

  • 特殊情况:n=0时为空二叉树;n=1时为单节点树。

资料:https://pan.quark.cn/s/43d906ddfa1bhttps://pan.quark.cn/s/90ad8fba8347https://pan.quark.cn/s/d9d72152d3cf

二、关键特性

  1. 层数与节点数
    • 第i层最多有2ⁱ⁻¹个节点(i≥1);
    • 深度为k的二叉树最多有2ᵏ - 1个节点(满二叉树)。
  2. 叶子节点公式:对于任意二叉树,度为0的节点数(叶子)= 度为2的节点数 + 1。
  3. 完全二叉树:除最后一层外,每层节点数均满,最后一层节点从左到右连续排列(常用于堆排序)。

三、常见分类

类型 特点 应用场景
满二叉树 所有层节点数均为最大值(2ⁱ⁻¹) 理论研究、完全二叉树特例
完全二叉树 按层序编号与满二叉树一致 堆(大顶堆/小顶堆)、优先队列
二叉搜索树(BST) 左子树所有节点值<根节点值<右子树所有节点值 快速查找、插入(平均O(logn))
平衡二叉树(AVL) 左右子树深度差≤1 解决BST斜树退化问题
红黑树 自平衡BST,节点分红/黑,满足5条规则 TreeMap、HashMap(JDK8)

四、核心操作(Python示例)

1. 二叉树节点定义

python 复制代码
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val  # 节点值
        self.left = left  # 左子节点
        self.right = right  # 右子节点

2. 遍历(高频考点)

(1)前序遍历(根→左→右)
python 复制代码
# 递归版
def preorderTraversal(root):
    res = []
    def dfs(node):
        if node:
            res.append(node.val)
            dfs(node.left)
            dfs(node.right)
    dfs(root)
    return res

# 迭代版(栈实现)
def preorderTraversal(root):
    res, stack = [], [root]
    while stack:
        node = stack.pop()
        if node:
            res.append(node.val)
            stack.append(node.right)  # 右先入栈(栈先进后出)
            stack.append(node.left)
    return res
(2)中序遍历(左→根→右)
python 复制代码
# 递归版
def inorderTraversal(root):
    res = []
    def dfs(node):
        if node:
            dfs(node.left)
            res.append(node.val)
            dfs(node.right)
    dfs(root)
    return res

# 迭代版(栈实现)
def inorderTraversal(root):
    res, stack = [], []
    while root or stack:
        while root:
            stack.append(root)
            root = root.left  # 左子树遍历到底
        root = stack.pop()
        res.append(root.val)
        root = root.right  # 处理右子树
    return res
(3)后序遍历(左→右→根)
python 复制代码
# 递归版
def postorderTraversal(root):
    res = []
    def dfs(node):
        if node:
            dfs(node.left)
            dfs(node.right)
            res.append(node.val)
    dfs(root)
    return res

# 迭代版(栈+标记)
def postorderTraversal(root):
    res, stack = [], [(root, False)]
    while stack:
        node, visited = stack.pop()
        if node:
            if visited:
                res.append(node.val)
            else:
                stack.append((node, True))
                stack.append((node.right, False))
                stack.append((node.left, False))
    return res
(4)层序遍历(按层输出,BFS)
python 复制代码
from collections import deque

def levelOrder(root):
    res = []
    if not root:
        return res
    queue = deque([root])
    while queue:
        level_size = len(queue)  # 当前层节点数
        level_res = []
        for _ in range(level_size):
            node = queue.popleft()
            level_res.append(node.val)
            if node.left:
                queue.append(node.left)
            if node.right:
                queue.append(node.right)
        res.append(level_res)
    return res

3. 高频面试题实现

(1)求二叉树的深度
python 复制代码
def maxDepth(root):
    if not root:
        return 0
    left_depth = maxDepth(root.left)
    right_depth = maxDepth(root.right)
    return max(left_depth, right_depth) + 1  # 根节点占1层
(2)判断是否为平衡二叉树
python 复制代码
def isBalanced(root):
    def check_depth(node):
        if not node:
            return 0
        left = check_depth(node.left)
        if left == -1:
            return -1  # 左子树不平衡
        right = check_depth(node.right)
        if right == -1:
            return -1  # 右子树不平衡
        # 左右深度差>1则不平衡
        return max(left, right) + 1 if abs(left - right) <= 1 else -1
    return check_depth(root) != -1
(3)二叉搜索树(BST)验证
python 复制代码
def isValidBST(root):
    def dfs(node, min_val, max_val):
        if not node:
            return True
        # BST规则:左<根<右
        if not (min_val < node.val < max_val):
            return False
        # 左子树最大值为当前节点值,右子树最小值为当前节点值
        return dfs(node.left, min_val, node.val) and dfs(node.right, node.val, max_val)
    return dfs(root, float('-inf'), float('inf'))

五、应用场景

  1. 搜索与排序:BST、红黑树用于高效查找/插入/删除(如数据库索引);
  2. 层次化数据处理:目录结构、XML/HTML解析(DOM树);
  3. 算法优化:二叉堆用于堆排序、优先队列(如任务调度);
  4. 路径问题:二叉树的最长路径、最近公共祖先(LCA)等面试高频场景。

六、关键注意点

  1. 递归是二叉树操作的核心思想,但需注意栈溢出(深度过大时用迭代);
  2. 二叉搜索树的中序遍历是升序序列(重要性质,用于验证和排序);
  3. 平衡二叉树(AVL/红黑树)解决了普通BST斜树退化(时间复杂度O(n))的问题,保证O(logn)效率。
相关推荐
Rock_yzh1 小时前
LeetCode算法刷题——54. 螺旋矩阵
数据结构·c++·学习·算法·leetcode·职场和发展·矩阵
ベadvance courageouslyミ1 小时前
数据结构(一)
数据结构
lightqjx1 小时前
【C++】对set和map的使用
开发语言·数据结构·c++·stl
AI科技星2 小时前
时空运动的几何约束:张祥前统一场论中圆柱螺旋运动光速不变性的严格数学证明与物理诠释
服务器·数据结构·人工智能·python·科技·算法·生活
别或许2 小时前
哈夫曼编码原理与应用详解
数据结构
集芯微电科技有限公司3 小时前
40V/3A高性能高集成三相BLDC驱动器具有电流及故障诊断功能(FLT)
c语言·数据结构·单片机·嵌入式硬件·fpga开发
liu****3 小时前
13.数据在内存中的存储
c语言·开发语言·数据结构·c++·算法
Unstoppable223 小时前
代码随想录算法训练营第 55 天 | 53. 寻宝(Prim + Kruskal)
数据结构·算法··kruskal·prim
liu****3 小时前
15.自定义类型:联合和枚举
数据结构·c++·剪枝