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;
相关推荐
先积累问题,再逐次解决10 分钟前
快速幂优美算法
算法
XiYang-DING32 分钟前
【LeetCode】 225.用队列实现栈
算法·leetcode·职场和发展
花月C1 小时前
线性动态规划(Linear DP)
算法·动态规划·代理模式
hetao17338371 小时前
2025-03-24~04-06 hetao1733837 的刷题记录
c++·算法
_深海凉_1 小时前
LeetCode热题100-环形链表
算法·leetcode·链表
原来是猿1 小时前
Linux进程信号详解(三):信号保存
开发语言·c++·算法
2401_892070982 小时前
算法与数据结构精讲:最大子段和(暴力 / 优化 / 分治)+ 线段树从入门到实战
c++·算法·线段树·最大子段和
memcpy02 小时前
LeetCode 904. 水果成篮【不定长滑窗+哈希表】1516
算法·leetcode·散列表
老四啊laosi2 小时前
[双指针] 8. 四数之和
算法·leetcode·四数之和