leetcode算法(559.N叉树的最大深度)

二叉树递归(后序遍历)

cpp 复制代码
class Solution {
public:
    // 计算N叉树的最大深度
    int maxDepth(Node* root) {
        // 递归终止条件:如果当前节点为空,深度为0
        // 注意:这里用0表示空指针,通常写作nullptr更清晰
        if (root == 0) return 0;
        
        // 初始化当前节点的子树最大深度为0
        int depth = 0;
        
        // 遍历当前节点的所有子节点
        for (int i = 0; i < root->children.size(); i++) {
            // 递归计算每个子树的深度
            // 更新depth为所有子树深度的最大值
            depth = max (depth, maxDepth(root->children[i]));
        }
        
        // 返回当前节点的深度 = 子树最大深度 + 1
        return depth + 1;
    }
};
  1. if (root == 0) return 0;

    • 递归基准情况:空节点深度为0

    • 在C++中,0NULLnullptr都可以表示空指针

    • 推荐使用 if (root == nullptr)if (!root) 更清晰

  2. int depth = 0;

    • 初始化变量,用于记录当前节点的子节点中的最大深度

    • 注意:这不是最终返回的深度,最终要加1

  3. for (int i = 0; i < root->children.size(); i++)

    • 遍历当前节点的所有子节点

    • 使用索引循环,也可以用范围for循环:for (Node* child : root->children)

  4. depth = max(depth, maxDepth(root->children[i]));

    • 递归计算每个子节点的深度

    • max函数不断更新找到的最大子节点深度

    • 这行代码会递归展开整个子树

  5. return depth + 1;

    • 关键步骤:当前节点的深度 = 子节点的最大深度 + 1

    • 加1代表当前节点本身的一层深度

举例

复制代码
        1 
      /  |  \
     2   3   4
    / \       \
   5   6       7

步骤1:处理节点1

cpp 复制代码
maxDepth(1):


  if (1 == 0) return 0;    // false,if语句不成立,继续执行下一行代码
  int depth = 0;           // depth = 0
  
  // 开始分别遍历子节点 [2, 3, 4]
  
  // 第【0】个子节点:节点2
  for (int i = 0; i < 1->children.size(); i++): // i = 0
    depth = max(depth, maxDepth(1->children[0])); // 调用 maxDepth(2)

步骤2:处理节点2(递归调用)

cpp 复制代码
maxDepth(2):


  if (2 == 0) return 0;    // false,直接执行下一条语句
  int depth = 0;           // depth = 0
  
  // 遍历节点2的子节点 [5, 6]
  
  // 第【0】个子节点:节点5
  depth = max(depth, maxDepth(5)); // 调用 maxDepth(5)

步骤3:处理节点5

cpp 复制代码
maxDepth(5):

  if (5 == 0) return 0;    // false
  int depth = 0;           // depth = 0
  
  // 遍历子节点:5->children.size() = 0 ,所以0<0不成立
  // for循环不执行
  
  return depth + 1;        // return 0 + 1 = 1
// 节点5返回深度1

所以maxDepth(5)=1

步骤4:继续处理节点2

cpp 复制代码
// 回到 maxDepth(2):
  depth = max(0, maxDepth(5)=1); // depth = max(0, 1) = 1
  
  // for循环下一个子节点,第【1】节点:节点6
  depth = max(1, maxDepth(6));   // 调用 maxDepth(6)

步骤5:处理节点6

cpp 复制代码
maxDepth(6):


  if (6 == 0) return 0;    // false
  int depth = 0;           // depth = 0
  
// 遍历子节点:6->children.size() = 0,0<0,所以不执行for循环
  
  return depth + 1;        // return 0 + 1 = 1
// 节点6返回深度1

所以maxDepth(6)=1

步骤6:完成节点2的计算

cpp 复制代码
// 回到 maxDepth(2):
  depth = max(1, maxDepth(6)=1); // depth = max(1, 1) = 1
  
// 节点2的所有孩子节点均已遍历过,for循环结束
  
  return depth + 1;        // return 1 + 1 = 2
// 节点2返回深度2

步骤7:回到节点1继续处理

cpp 复制代码
// 回到 maxDepth(1):
  depth = max(0, maxDepth(2)=2); // depth = max(0, 2) = 2
  
  // 下一个子节点:节点3
  depth = max(2, maxDepth(3));   // 调用 maxDepth(3)

步骤8:处理节点3

cpp 复制代码
maxDepth(3):


  if (3 == 0) return 0;    // false
  int depth = 0;           // depth = 0
  
  // 遍历子节点:3->children.size() = 0
  
  return depth + 1;        // return 0 + 1 = 1
// 节点3返回深度1

步骤9:继续处理节点1

cpp 复制代码
// 回到 maxDepth(1):
  depth = max(2, maxDepth(3)=1); // depth = max(2, 1) = 2
  
  // 下一个子节点:节点4
  depth = max(2, maxDepth(4));   // 调用 maxDepth(4)

步骤10:处理节点4

cpp 复制代码
maxDepth(4):


  if (4 == 0) return 0;    // false
  int depth = 0;           // depth = 0
  
  // 遍历子节点 [7]
  depth = max(depth, maxDepth(7)); // 调用 maxDepth(7)

步骤11:处理节点7

cpp 复制代码
maxDepth(7):


  if (7 == 0) return 0;    // false
  int depth = 0;           // depth = 0
  
  return depth + 1;        // return 0 + 1 = 1
// 节点7返回深度1

步骤12:完成节点4的计算

cpp 复制代码
// 回到 maxDepth(4):
  depth = max(0, maxDepth(7)=1); // depth = max(0, 1) = 1
  
  return depth + 1;        // return 1 + 1 = 2
// 节点4返回深度2

步骤13:完成节点1的计算

cpp 复制代码
// 回到 maxDepth(1):
  depth = max(2, maxDepth(4)=2); // depth = max(2, 2) = 2
  
  // for循环结束,所有子节点处理完毕
  
  return depth + 1;        // return 2 + 1 = 3
// 节点1返回深度3
复制代码
maxDepth(1) = 3
├── maxDepth(2) = 2
│   ├── maxDepth(5) = 1
│   └── maxDepth(6) = 1
├── maxDepth(3) = 1
└── maxDepth(4) = 2
    └── maxDepth(7) = 1

最终结果 maxDepth(1) = 3

层序遍历

cpp 复制代码
class Solution {
public:
    int maxDepth(Node* root) {
        queue<Node*> que;
        if (root != NULL) que.push(root);
        int depth = 0;
        while (!que.empty()) {
            int size = que.size();
            depth++; // 记录深度
            for (int i = 0; i < size; i++) {
                Node* node = que.front();
                que.pop();
                for (int j = 0; j < node->children.size(); j++) {
                    if (node->children[j]) que.push(node->children[j]);
                }
            }
        }
        return depth;
    }
};
相关推荐
AI软著研究员42 分钟前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish1 小时前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱2 小时前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者18 小时前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮18 小时前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者19 小时前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考19 小时前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx1 天前
CART决策树基本原理
算法·机器学习
Wect1 天前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript
颜酱1 天前
单调队列:滑动窗口极值问题的最优解(通用模板版)
javascript·后端·算法