描述:
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度,根节点的深度视为 1 。
数据范围:节点的数量满足 0≤n≤1000≤n≤100 ,节点上的值满足 0≤val≤1000≤val≤100
进阶:空间复杂度 O(1),时间复杂度 O(n)
思路:
1.层次遍历
设置一个辅助队列,分层统计,按照从上到下,从左到右的顺序,每次让每一层的所有节点都入队,队列里的元素个数为每一层的节点数,遍历完一层后,让记录层数的值+1,到最后到达最远的叶子节点后,返回层数记录值。
代码实现:
public class Solution {
public int TreeDepth(TreeNode root) {
if (root == null) return 0;
Queue<TreeNode> queue = new LinkedList<>();
int res = 0;
queue.offer(root);
while (!queue.isEmpty()){
int n = queue.size();
for (int i=0;i<n;i++){
TreeNode node = queue.poll();
if (node.left != null) queue.offer(node.left);
if (node.right != null) queue.offer(node.right);
}
res++;
}
return res;
}
}
2.递归思路
递归思路很好想,代码也很简单,只要一个问题可以分解成结构相同,规模更小的子问题,并且最终有递归退出条件,那就一般可以考虑递归,但是由于其时间复杂度,一般不推荐。
在本题中,问题可以简化为,求当前根二叉树的深度就等于求其左右子树深度的最大值+1,而每颗子树,又可以将其看做一个根节点,迭代这个思路,将大问题划归成小问题,利用递归解决。
代码:
public class Solution {
public int maxDepth (TreeNode root) {
//空节点没有深度
if(root == null)
return 0;
//返回子树深度+1
return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;
}
}
总结:
此题属于简单题,但层次遍历是二叉树的基础算法,需要熟练掌握,而层次遍历又会用到队列这种数据结构,举一反三的话,层次遍历与广度优先算法BFS是有一些相似的,也是用到了队列,相对应的,二叉树里面的深度优先算法DFS,会用到栈这种结构,这些基本都属于是二叉树这块的基础技能。