题目描述:
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度,根节点的深度视为 1 。
数据范围:节点的数量满足 0≤n≤100 ,节点上的值满足0≤val≤100
进阶:空间复杂度 O(1) ,时间复杂度 O(n)
假如输入的用例为{1,2,3,4,5,#,6,#,#,7},那么如下图:
示例:
输入:
{1,2,3,4,5,#,6,#,#,7}
返回值:
4
解题思路:
本题考察数据结构树的使用。有两个解法。
- 递归。分治思想,分别统计左右两个子树的深度,取最大值加一即可;从根结点开始,一级级往下统计,再返回上去就得到结果了。
- 队列。队列的特点是先进先出,我们想将根结点扔进去,用size读取当前队列的长度,然后进行size次的弹出,同时每次弹出后再往队列中塞入被弹出结点的左右树;如果队列中持续有结点,说明没到底部;若队列为空,说明当前的level就是最深的深度了,再往下没有结点了。
测试代码:
解法一:递归
/* 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; int leftnum=TreeDepth(pRoot->left); int rightnum=TreeDepth(pRoot->right); return max(leftnum,rightnum)+1; } };
解法二:队列
/* 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; q.push(pRoot); int level=0; // 队列先进先出 while(!q.empty()) { int size=q.size(); // 将当前级的结点遍历一遍 while(size--) { // 定位到头部,再弹出 auto f=q.front(); q.pop(); // 如果左右子树都为空,那么q就空了,也就终止循环了 if(f->left) q.push(f->left); if(f->right) q.push(f->right); } level++; } return level; } };