Leetcode104:二叉树的最大深度
题目描述:
给定一个二叉树,找出其最大深度。
二叉树的最大深度为根节点到最远叶子节点的最长路径上的节点数。
说明:叶子节点是指没有子节点的节点
示例:
给定二叉树
1
| [3, 9, 20, null, null, 15, 7]
|
返回它的最大深度3。
题解
方法一:递归
思路与算法
如果我们知道了左子树和右子树的最大深度为l和r,那么该二叉树的最大深度即为
而左子树和右子树的最大深度又可以以同样的方式进行计算。因此我们在计算当前二叉树的最大深度时,可以先递归计算出其左子树和右子树的最大深度,然后在O(1)时间内计算出当前二叉树的最大深度。递归在访问到空节点是退出。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| /** * 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 == nullptr) return 0; return max(maxDepth(root->left), maxDepth(root->right)) + 1; } };
|
复杂度分析
- 时间复杂度:O(n),其中n为二叉树节点的个数。每个节点在递归中只被遍历一次。
- 空间复杂度:O(heigh), 其中height表示二叉树的高度。递归函数需要栈空间,而栈空间取决于递归的深度,因此空间复杂度等价于二叉树的高度。
方法二:广度优先搜索
我们也可以用广度优先搜索的方法来解决这些题目,但我们需要对其进行一些修改,此时我们BFS的队列里「当前层的所有节点」。每次拓展下一层的时候,不同于BFS的每次只从队列里拿出一个节点,我们需要将队列里的所有节点都拿出来进行扩展,这样能保证每次拓展完的时候队列里存放的是当前层的所有节点,即我们是一层一层的进行拓展,最后我们用一个变量ans来维护拓展的次数, 该二叉树的最大深度即为ans。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| /** * 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 == nullptr) return 0; queue<TreeNode*> Q; Q.push(root); int ans = 0; while(!Q.empty()) { int sz = Q.size(); while (sz > 0) { TreeNode* node = Q.front(); Q.pop(); if(node->left) Q.push(node->left); if(node->right) Q.push(node->right) sz-=1; } ans +=1; } return ans; } };
|