day 13 第六章 二叉树 part01代码随想录算法训练营71期

二叉树核心概念与遍历方法

满二叉树

如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。。

完全二叉树

除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。

二叉搜索树(BST)

若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

它的左、右子树也分别为二叉排序树。

平衡二叉搜索树(AVL)

它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

map、set、multimap,multiset的底层实现都是平衡二叉搜索树,unordered_map、unordered_set底层实现是哈希表。


二叉树存储与遍历方式

二叉树的定义 和链表是差不多的,相对于链表 ,二叉树的节点里多了一个指针, 有两个指针,指向左右孩子。

存储方式

  • 链式存储:通过左右指针连接节点

    cpp 复制代码
    struct TreeNode {
        int val;
        TreeNode *left;
        TreeNode *right;
        TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    };
  • 顺序存储:使用数组,适合完全二叉树

深度优先遍历(DFS)

前中后序指的就是中间节点的位置,借助栈使用递归的方式

递归三要素:

  1. 参数与返回值:通常传入当前节点指针和结果容器
  2. 终止条件:当前节点为空时返回
  3. 单层逻辑:按前/中/后序处理节点

前序遍历代码示例:

cpp 复制代码
void traversal(TreeNode* cur, vector<int>& vec) {
    if (cur == nullptr) return;
    vec.push_back(cur->val);    // 中
    traversal(cur->left, vec);  // 左
    traversal(cur->right, vec); // 右
}

广度优先遍历(BFS)

使用队列实现层序遍历:

cpp 复制代码
vector<vector<int>> levelOrder(TreeNode* root) {
    queue<TreeNode*> que;
    if (root) que.push(root);
    vector<vector<int>> result;
    while (!que.empty()) {
        int size = que.size();
        vector<int> level;
        for (int i = 0; i < size; i++) { //que.size是不断变化的
            TreeNode* node = que.front();
            que.pop();
            level.push_back(node->val);
            if (node->left) que.push(node->left);
            if (node->right) que.push(node->right);
        }
        result.push_back(level);
    }
    return result;
}

递归法

遍历根节点(depth=0):result.size()=0 → 新建 vector,result 变为 [[]];

遍历根的左孩子(depth=1):result.size()=1 → 新建 vector,result 变为 [ [], [] ];

遍历根的右孩子(depth=1):result.size()=2 > 1 → 不创建,直接往 result[1] 里加值。


力扣题目解题要点

144.二叉树的前序遍历

102.二叉树的层序遍历
107.二叉树的层次遍历 II

反转

429. N 叉树的层序遍历

TreeNode是「固定 2 个子节点」,Node是「任意 N 个子节点」。

右视图(199题)

层序遍历时记录每层最后一个节点:

cpp 复制代码
if (i == size - 1) result.push_back(node->val);

层平均值(637题)

统计每层节点值的和再取平均:

cpp 复制代码
result.push_back(sum  / size);

515.在每个树行中找最大值

int maxValue=INT_MIN;

maxValue=node->val>maxValue?node->val:maxValue;

填充右侧指针(116题)

层序遍历时连接同层相邻节点:

cpp 复制代码
nodePre->next = node;  // 前驱节点指向当前
nodePre = node;        // 更新前驱

最大深度(104题)

cpp 复制代码
depth  + + 

最小深度(111题)

注意只有到达叶子节点时才更新深度:

cpp 复制代码
if (!node->left && !node->right) 
    return depth;
相关推荐
2401_900151542 小时前
C++中的桥接模式
开发语言·c++·算法
小O的算法实验室2 小时前
2026年IEEE TNSE SCI2区,基于预测的双阶段分布式任务分配方法+搜救场景中最大化任务分配,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
月流霜2 小时前
Midjourney 零基础控图七大参数
人工智能·算法·midjourney
luckycoding2 小时前
1487. 保证文件名唯一
数据结构·算法·leetcode
DeeGLMath2 小时前
从基础算法到机器学习的研究轨迹
人工智能·算法·机器学习
Barkamin2 小时前
冒泡排序的简单实现
java·算法·排序算法
_dindong2 小时前
【单调栈/队列&并查集&字符串哈希&Tire树】习题集锦
数据结构·c++·算法·哈希算法
独自破碎E2 小时前
【手撕真题】合并区间
算法
big_rabbit05023 小时前
[算法][力扣110]平衡二叉树
数据结构·算法·leetcode