LeetCode 104 Maximum Depth of Binary Tree
题干:
求一棵二叉树的最大深度。最大深度就是根节点到最远叶子节点的最长路径上的节点数。
Input: root = [3,9,20,null,null,15,7]
Output: 3
解:
递归:
方法1:
“自上而下”的思想。遍历一遍二叉树,用一个外部变量depth记录每个节点所在的深度,取最大值就可得到最大深度。
实际求的就是树的深度。
int maxx = 0;
int depth = 0;
int maxDepth(TreeNode* root) {
traverse(root);
return maxx;
}
void traverse(TreeNode* root){
if(!root) return;
++depth;
maxx = max(maxx, depth);
traverse(root->left);
traverse(root->right);
--depth;
}
或者写成(不需要额外外部变量):
int maxx = 0;
int maxDepth(TreeNode* root) {
traverse(root, 1);
return maxx;
}
void traverse(TreeNode* root, int depth){
if(!root) return;
maxx = max(maxx, depth);
traverse(root->left, depth + 1);
traverse(root->right, depth + 1);
}
方法2:
“自下而上”的思想。
一棵二叉树的最大深度可以通过子树的最大深度推导出来。
实际求的是树的高度。
int maxDepth(TreeNode* root) {
if(!root) return 0;
int leftDepth = maxDepth(root->left);
int rightDepth = maxDepth(root->right);
return max(leftDepth, rightDepth) + 1;
}
迭代:
方法3:
二叉树的层序遍历,借助队列。
int maxDepth(TreeNode* root) {
if(!root) return 0;
queue<TreeNode*> q;
int depth = 0;
q.push(root);
while(!q.empty()){
int n = q.size();
++depth;
for(int i = 0; i < n; i++){
TreeNode* t = q.front();
q.pop();
if(t->left) q.push(t->left);
if(t->right) q.push(t->right);
}
}
return depth;
}