本文为剑指 offer 系列第三十七篇。
主要知识点为二叉树,可以用递归或层序遍历两种方式来解决这个问题。
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
解题思路
思路1
由于树结构的特殊性,天然的可以利用递归来解决这一类的问题。
思路2
可以使用层序遍历来解决这个问题。
解题代码
思路1代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution { public: int TreeDepth(TreeNode* pRoot) { // 方法一 :递归求解 if(!pRoot) { return 0; }else{ return max(TreeDepth(pRoot->left),TreeDepth(pRoot->right))+1; }
} };
|
时间复杂度为O(n),空间复杂度为O(n)
思路2代码
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
| /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution { public: int TreeDepth(TreeNode* pRoot) { // 方法二: 队列层序遍历 if(!pRoot) return 0; queue<TreeNode*> q{{pRoot}}; int dep = 0; while(!q.empty()){ for(int i = q.size();i>0;i--){ TreeNode* a = q.front(); q.pop(); if(a->left) q.push(a->left); if(a->right) q.push(a->right); } dep++; } return dep; } };
|
时间复杂度为O(n),空间复杂度为O(n)
以上,本题结束!