题目链接
题目描述
从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。

解题思路
方法一(分治法)
分治法简介:求一个规模为n的问题,先求左边规模大约为n/2的问题,再求右边规模大约为n/2的问题,然后合并左边,右边的解,从而求得最终解。具体可参考归并排序。
- 终止条件: 当 root 为空,说明已越过叶节点,因此返回 深度 00 。
- 递推工作: 本质上是对树做后序遍历。
- 计算节点 root 的 左子树的深度 ,即调用 maxDepth(root.left);
- 计算节点 root 的 右子树的深度 ,即调用 maxDepth(root.right);
- 返回值: 返回 此树的深度 ,即 max(maxDepth(root.left), maxDepth(root.right)) + 1。
`
`
/*struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;TreeNode(int x) :val(x), left(NULL), right(NULL) {}};*/class Solution {public:int TreeDepth(TreeNode* pRoot){if(pRoot==nullptr)return 0;return max(TreeDepth(pRoot->left), TreeDepth(pRoot->right))+1;}};/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/class Solution {public:int maxDepth(TreeNode* root) {return deep(root);}int deep(TreeNode* root,int d = 0){if(root == nullptr){return d;}return max(deep(root->left,d+1),deep(root->right,d+1));}};
- 时间复杂度 O(N) : N 为树的节点数量,计算树的深度需要遍历所有节点。
空间复杂度 O(N) : 最差情况下(当树退化为链表时),递归深度可达到 N 。
方法二(层次遍历)
树的层序遍历 / 广度优先搜索往往利用 队列 实现。
- 关键点: 每遍历一层,则计数器 +1 ,直到遍历完成,则可得到树的深度。
算法解析:
- 特例处理: 当
root为空,直接返回 深度 0 。 - 初始化: 队列
queue(加入根节点root),计数器res = 0。 - 循环遍历: 当
queue为空时跳出。- 记录当前层中结点个数
- 遍历队列: 遍历 queue 中的各节点 node ,并将其左子节点和右子节点加入 tmp;
- 统计层数: 执行 res += 1 ,代表层数加 1;
- 返回值: 返回
res即可。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: int maxDepth(TreeNode* root) { if(root==NULL) return 0; return recur(root); } private: int recur(TreeNode* root){ int k=0; queue<TreeNode*> qu; qu.push(root); while(!qu.empty()){ int sz = qu.size(); while(sz--){ TreeNode* node = qu.front(); qu.pop(); if(node->left) qu.push(node->left); if(node->right) qu.push(node->right); } k++; } return k; } };/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: int maxDepth(TreeNode* root) { if(root==NULL) return 0; return recur(root); } private: int recur(TreeNode* root){ int k=1; queue<TreeNode*> qu; bool visited = false; qu.push(root); while(!qu.empty()){ int sz = qu.size(); while(sz--){ TreeNode* node = qu.front(); qu.pop(); if(node->left){ qu.push(node->left); visited=true; } if(node->right){ qu.push(node->right); visited=true; } } if(visited){ k++; visited = false; }else{ return k; } } return k; } };
- 时间复杂度 O(N) : N 为树的节点数量,计算树的深度需要遍历所有节点。
- 空间复杂度 O(N) : 最差情况下(当树平衡时),队列 queue 同时存储 N/2 个节点。
