
方法一:深度优先搜索(递归法,面试首选)
1. 核心思路(分治思想)
二叉树的深度有一个铁律:
当前节点的深度 = max (左子树深度,右子树深度) + 1
- 先算左子树的最大深度
- 再算右子树的最大深度
- 取两者的最大值,加上当前节点本身(+1),就是当前节点的深度
- 递归终止条件:空节点的深度为 0(没有节点,深度就是 0)
这个思路本质是后序遍历:先处理左子树,再处理右子树,最后处理当前节点。
cpp
/**
* 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) {
//递归
//为空 就返回
if(root == nullptr) return 0;
//否则就一直左子树 右字数遍历
return max(maxDepth(root->left),maxDepth(root->right))+1;
}
};
方法二:广度优先搜索(层序遍历法,面试进阶)
1. 核心思路
层序遍历就是一层一层地遍历树,每遍历完一层,深度就加 1。
- 用队列存储当前层的所有节点
- 每次先记录当前队列的大小(也就是当前层的节点数)
- 一次性把当前层的所有节点都处理完,把它们的左右孩子入队
- 处理完一层,深度加 1
- 直到队列为空,返回深度
cpp
/**
* 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) {
//层序 BFS 广度优先搜索
//仍然是如果根为空 直接返回
if(root == nullptr) return 0;
queue<TreeNode *> Q;//创建一个队列
Q.push(root);//把当前的根入队
int ans = 0;
while(!Q.empty()){
//循环条件:Q队列不为空
int sz = Q.size();
while(sz>0){
TreeNode* node = Q.front();//最先入队的存到node中
Q.pop();// 弹出队首
if(node->left){
Q.push(node->left);
}
if(node->right){
Q.push(node->right);
}
sz -=1
}
ans += 1;
}
return ans;
}
};