力扣104.二叉树的最大深度 110. 平衡二叉树

104. 二叉树的最大深度(简单)

题目:给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

示例

复制代码
给定二叉树 [3,9,20,null,null,15,7],
    3
   / \
  9  20
    /  \
   15   7
返回深度 3。

解法一:递归(DFS)

cpp 复制代码
class Solution {
public:
    int maxDepth(TreeNode* root) {
        if (!root) return 0;
        return 1 + max(maxDepth(root->left), maxDepth(root->right));
    }
};

解法二:迭代(BFS,层序遍历)

cpp 复制代码
class Solution {
public:
    int maxDepth(TreeNode* root) {
        if (!root) return 0;
        queue<TreeNode*> q;
        q.push(root);
        int depth = 0;
        while (!q.empty()) {
            int size = q.size();
            for (int i = 0; i < size; ++i) {
                TreeNode* node = q.front(); q.pop();
                if (node->left) q.push(node->left);
                if (node->right) q.push(node->right);
            }
            ++depth;
        }
        return depth;
    }
};

110. 平衡二叉树(简单)

题目:给定一个二叉树,判断它是否是平衡二叉树。

注释:平衡二叉树是指该树所有节点的左右子树高度相差不大于1

示例

复制代码
输入:root = [3,9,20,null,null,15,7]
输出:true

输入:root = [1,2,2,3,3,null,null,4,4]
输出:false

解法:自底向上递归(后序遍历)

cpp 复制代码
class Solution {
public:
    bool isBalanced(TreeNode* root) {
        return getHeight(root) != -1;
    }
private:
    int getHeight(TreeNode* node) {
        if (!node) return 0;
        int left = getHeight(node->left);
        if (left == -1) return -1;
        int right = getHeight(node->right);
        if (right == -1) return -1;
        if (abs(left - right) > 1) return -1;
        return 1 + max(left, right);
    }
};

复杂度:时间 O(n),空间 O(n)(递归栈)。

二叉树遍历详解

二叉树的遍历是指按照某种顺序访问树中的每个节点,确保每个节点被访问一次。常见的遍历方式有四种:前序遍历中序遍历后序遍历层序遍历


一、后序遍历(Post-order Traversal)

定义 :先访问左子树,再访问右子树,最后访问根节点。
顺序 :左 → 右 → 根
用途:常用于释放树节点、计算树的高度、求表达式树的值等需要先处理子节点再处理父节点的场景。

递归实现

cpp 复制代码
void postorder(TreeNode* root) {
    if (!root) return;
    postorder(root->left);
    postorder(root->right);
    cout << root->val << " ";  // 访问根节点
}

示例树

复制代码
    1
   / \
  2   3
 / \
4   5

后序遍历结果:4 5 2 3 1


二、其他遍历方式

1. 前序遍历(Pre-order Traversal)
  • 顺序:根 → 左 → 右
  • 用途:复制树、序列化、前缀表达式。
  • 结果 (同上树):1 2 4 5 3
cpp 复制代码
void preorder(TreeNode* root) {
    if (!root) return;
    cout << root->val << " ";
    preorder(root->left);
    preorder(root->right);
}
2. 中序遍历(In-order Traversal)
  • 顺序:左 → 根 → 右
  • 用途:二叉搜索树(BST)的中序遍历得到有序序列。
  • 结果 (同上树):4 2 5 1 3
cpp 复制代码
void inorder(TreeNode* root) {
    if (!root) return;
    inorder(root->left);
    cout << root->val << " ";
    inorder(root->right);
}
3. 层序遍历(Level-order Traversal)
  • 顺序:从上到下,从左到右逐层访问。
  • 用途:广度优先搜索(BFS)、求树的最小深度、打印树形结构。
  • 结果 (同上树):1 2 3 4 5
cpp 复制代码
void levelOrder(TreeNode* root) {
    if (!root) return;
    queue<TreeNode*> q;
    q.push(root);
    while (!q.empty()) {
        TreeNode* node = q.front(); q.pop();
        cout << node->val << " ";
        if (node->left) q.push(node->left);
        if (node->right) q.push(node->right);
    }
}

三、递归与迭代实现对比

  • 递归:代码简洁,但可能因树深度过大导致栈溢出(如退化为链表)。
  • 迭代:需手动模拟栈,但可避免递归深度限制,且更容易控制。

例如,前序遍历的迭代实现:

cpp 复制代码
vector<int> preorderTraversal(TreeNode* root) {
    vector<int> res;
    stack<TreeNode*> stk;
    if (root) stk.push(root);
    while (!stk.empty()) {
        TreeNode* node = stk.top(); stk.pop();
        res.push_back(node->val);
        if (node->right) stk.push(node->right);
        if (node->left) stk.push(node->left);
    }
    return res;
}

四、总结

遍历方式 访问顺序 典型应用
前序遍历 根 → 左 → 右 复制树、序列化
中序遍历 左 → 根 → 右 BST 排序输出
后序遍历 左 → 右 → 根 计算高度、释放树
层序遍历 逐层从左到右 BFS、最短路径

理解这些遍历是解决二叉树问题的基础,例如:

  • LeetCode 104 二叉树的最大深度 可以用后序遍历或层序遍历。
  • LeetCode 110 平衡二叉树 使用后序遍历自底向上判断高度差。
相关推荐
手写码匠9 分钟前
从零实现 Prompt 工程引擎:结构化提示、自动优化与多轮自省体系
人工智能·深度学习·算法·aigc
无限码力33 分钟前
阿里算法岗 0530笔试真题 - 多约束条件下的元素匹配统计
算法·阿里笔试真题·阿里机试真题·阿里算法岗笔试
lqqjuly41 分钟前
MLA — 多头潜在注意力深度解析
深度学习·神经网络·算法
吴可可1231 小时前
SolidWorks草图转三维DWG技巧
算法
redaijufeng2 小时前
C++雾中风景7:闭包
c++·算法·风景
小欣加油2 小时前
leetcode287寻找重复数
数据结构·c++·算法·leetcode
尽兴-3 小时前
2.1 向量基础:Embedding、余弦相似度、欧氏距离、向量检索
算法·embedding·欧氏距离·向量检索·余弦相似度
Black蜡笔小新3 小时前
自动化AI算法训练服务器DLTM训推一体工作站赋能多行业智能化升级
人工智能·算法·自动化
怪兽学LLM3 小时前
LeetCode 438 找到字符串中所有字母异位词(Python 固定滑动窗口+字符计数解法)
python·算法·leetcode
满怀冰雪3 小时前
第04篇-双指针算法-从有序数组到回文判断的高频解法
java·算法