题目
给定一棵二叉树,求该树的最大深度
解法一:DFS(递归算法)
求二叉树的深度如果使用深度优先遍历就是计算每条路径的深度,然后比较哪一条最长,返回哪一条。如果换做使用递归,就是从下往上比较,看对于每一个结点来说左右哪条路最短,选择哪一条返回。由于递归方法比较简单,在此我们就不做赘述了,直接上代码!!!
public int maxDepth(TreeNode root){
if(root == null){return 0;}
else{
return 1+max(maxDepth(root.left),maxDepth(root.right));
}
}
public static int max(int x,int y){
return x>y?x:y;
}
解法二:BFS
如果使用广度优先遍历,那么使用队列就是最好的选择(因为队列满足先进先出,父子结点按顺序来)。我们可以让每一层的结点依次进队列,设置一个变量统计进队列的结点数量。待该层结点全部进队列后再逐个出队列,共出该层进队列数量个结点,每个出队列都要判断该结点是否有子节点,如果有就让子节点再进队列。如此直到队列为空。
public int maxDepth(TreeNode root){
Queue<TreeNode> q = new LinkedList<TreeNode>();
if(root != null){q.offer(root);}
int deep = 0;
//直到队列为空
while(!q.isEmpty()){
deep++;
int size = q.size();
//该层的结点个数为size,一层循环用于层的更替
while(size != 0){
if(q.peek().left != null){
q.offer(q.peek().left);
}
if(q.peek().right != null){
q.offer(q.peek().right);
}
q.poll();
size--;
}
}
return deep;
}
如果你对Queue的库方法不太熟悉,可以参考这篇文章http://t.csdn.cn/qtgXl