104. 二叉树的最大深度
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],
3
/\
9 20
… / \
. 15 . 7
返回它的最大深度 3 。
思路1
因为深度是到叶子结点的路径,所以后序到叶子结点
1.后序遍历递归
- 递归函数参数:树节点,返回值是深度 int
- 当结点为空时返回此节点深度 0
- 然后分别向左向右递归得到当前结点左子树最大深度和右子树最大深度。
- 在“中”的操作里面得到 l 和 r 深度的最大值,之后 + 1,这个 1 是本层贡献的深度;
- 最后返回max值
代码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 PreOrder(TreeNode* node) {
if (node == NULL) return 0;
int l = PreOrder(node->left);
int r = PreOrder(node->right);
int maxh = max(l, r) + 1;
return maxh;
}
int maxDepth(TreeNode* root) {
return PreOrder(root);
}
};
思路2
用层序遍历迭代
因为要知道最大深度,其实就是拢共有多少层,所以可以使用层序遍历来写。
套模板,然后每进行一次while循环就将层数加一
代码2
/**
* 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) {
queue<TreeNode*> que;
if (root != NULL) {
que.push(root);
}
int maxh = 0;
while (!que.empty()) {
int size = que.size();
for (int i = 0; i < size; i++) {
TreeNode* node = que.front();
que.pop();
if (node->left) que.push(node->left);
if (node->right) que.push(node->right);
}
maxh++;
}
return maxh;
}
};