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 → 不创建,直接往 result1 里加值。


力扣题目解题要点

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;
相关推荐
To_OC5 小时前
LC 131 分割回文串:刚学回溯时,我连怎么切字符串都想不明白
javascript·算法·leetcode
旖-旎6 小时前
LeetCode 518:零钱兑换||(完全背包)—— 题解
c++·算法·leetcode·动态规划·背包问题
To_OC6 小时前
LC 42 接雨水:暴力超时卡半天?前后缀数组一用就通了
javascript·算法·leetcode
delishcomcn7 小时前
AI视觉识别+分切算法:电化铝缺陷检测与裁切一体化解锁
人工智能·算法
触底反弹7 小时前
深入理解大模型采样:Temperature、Top-K、Top-P 的原理与实战
人工智能·算法·面试
雪碧聊技术8 小时前
力扣 LCR 091. 粉刷房子 —— 动态规划入门详解
算法·动态规划
延凡科技10 小时前
多场景落地复盘:端边云架构无人机智能巡检系统设计与实践
大数据·数据结构·人工智能·科技·架构·无人机·能源
CV-Climber10 小时前
检索技术的实际应用
人工智能·算法
hhzz11 小时前
Tiger AI Platform平台中增加人脸识别功能
图像处理·人工智能·算法·计算机视觉·大模型