编程问题:
输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。
示例:
- 给定二叉树 [3,9,20,null,null,15,7],
返回它的最大深度 3
解法:
1.DFS
时间复杂度O(N),N 为树的节点数量,计算树的深度需要遍历所有节点。
空间复杂度O(N),最差情况下(当树退化为链表时),递归深度可达到 N 。
/**
* 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 {
private:
int dfs(TreeNode *root)
{
if (!root) return 0;
int left = dfs(root->left);
int right = dfs(root->right);
return max(left+1, right+1);
}
public:
int maxDepth(TreeNode* root) {
return dfs(root);
}
};
2.BFS
时间复杂度O(N),N 为树的节点数量,计算树的深度需要遍历所有节点。
空间复杂度O(N) ,最差情况下(当树平衡时),队列 queue 同时存储 N/2 个节点。
/**
* 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) return 0;
queue<TreeNode *> temp;
temp.push(root);
int height = 0;
while (!temp.empty())
{
height++;
int curSize = temp.size();
int cnt = 0;
while (cnt < curSize)
{
TreeNode *cur = temp.front();
cnt++;
temp.pop();
if (cur->left)
temp.push(cur->left);
if (cur->right)
temp.push(cur->right);
}
}
return height;
}
};