主要内容 #
- 问题描述
- 求解思路
- 参考代码
1. 问题描述 #
输入一棵二叉树的根节点,求该树的深度。从根节点到叶子节点依次经过的节点(含根、叶子节点)形成树的一条路径,最长路径为树的深度。

例如,在上图的二叉树深度为4,因为它从根节点到叶子节点最长路径包含4个节点(从根节点1开始,经过节点2和5,最终到达叶子节点7)。
2. 求解思路 #
我们从另一个角度来理解树的深度问题。
如果一棵树只有一个节点,那么它的深度是1。
如果根节点只有左子树而没有右子树没有右子树,那么树的深度就是左子树的深度加1。
同样,如果根节点只有右子树没有左子树,那么树的深度应该是其右子树的深度加1。
如果既有右子树又有左子树,那么该树的深度就是气左右子树深度较大值加1。
例如在图1所示的二叉树中,根节点为1的树有左、右两棵子树,其中左、右子树的根节点分别为节点2和节点3。根节点为2的左子树的深度为3,而根节点为3的右子树深度为2,因此,根节点为1的树的深度就是4。这种思路用递归的方法很容易实现。
3. 参考代码 #
#include <iostream>
#include <algorithm>
#include <queue //使用队列
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {
}
};
// 方法一:递归、DFS
class Solution {
public:
int TreeDepth(TreeNode* pRoot)
{
if ( pRoot == nullptr )
return 0;
int left = TreeDepth( pRoot->left );
int right = TreeDepth( pRoot->right );
return 1 + max( left , right );
}
};
// 方法二:BFS,层次遍历
class Solution_2 {
public:
int maxDepth(TreeNode* root) {
int ans = 0;
if ( root == nullptr )
return ans;
queue<TreeNode*> Q;
Q.push( root );
while ( !Q.empty() ) {
int scale = Q.size(); // 「必须」单独声明
for ( int i = 0; i < scale; ++i ) {
TreeNode* cur = Q.front(); Q.pop();
if ( cur->left )
Q.push( cur->left );
if ( cur->right )
Q.push( cur->right );
}
++ans; // 每一层 +1
}
return ans;
}
};
int main()
{
TreeNode *head = new TreeNode(5);
head->left = new TreeNode(3);
head->right = new TreeNode(8);
head->left->left = new TreeNode(2);
head->left->right = new TreeNode(4);
head->right->left = new TreeNode(7);
head->right->right = new TreeNode(10);
head->right->left->left = new TreeNode(6);
head->right->right->left = new TreeNode(9);
head->right->right->right = new TreeNode(11);
Solution solve;
cout << solve.TreeDepth(head) << endl;
return 0;
}