输入一棵二叉树的根结点,求该树的深度。
从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
数据范围
树中节点数量 [0,500]
。
样例
1 2 3 4 5 6 7 8
| 输入:二叉树[8, 12, 2, null, null, 6, 4, null, null, null, null]如下图所示: 8 / \ 12 2 / \ 6 4
输出:3
|
算法思想
对二叉树进行DFS遍历,在这个过程中,进入下一子树,则depth + 1
。
取左右子树depth
的最大值。
代码实现
推荐第一个,因为在做平衡二叉树的时候直接改改就行了。
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
|
class Solution { public: int dfs(TreeNode * root){ if(!root) return 0; int left = dfs(root -> left); int right = dfs(root -> right); return max(left, right) + 1; }
int treeDepth(TreeNode* root) { return dfs(root); } };
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
class Solution { public: int dfs(TreeNode * root, int depth){ if(!root) return depth; return max(dfs(root -> left, depth + 1), dfs(root -> right, depth + 1)); }
int treeDepth(TreeNode* root) { return dfs(root, 0); } };
|
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
|
class Solution { public: int dfs(TreeNode * root, int depth){ if(!root) return depth; int left = dfs(root -> left, depth + 1); int right = dfs(root -> right, depth + 1); return max(left, right); }
int treeDepth(TreeNode* root) { return dfs(root, 0); } };
|
时间复杂度
DFS遍历,每个节点只被遍历一次,时间复杂度是O(n)
。