求二叉树的深度
二叉树的深度定义为一颗二叉树的根节点到叶子节点的最长路径和。 本文给出两种方法求解分别是递归和队列
递归
递归首先要定义递归函数的意义
一棵二叉树的深度等于左子树和右子树深度的最大值加上1 代码
public int getDepth ( TreeNode root) {
if ( root== null ) return 0 ;
return Math . max ( getDepth ( root. left) , getDepth ( root. right) ) + 1 ;
}
队列的思路类似于层序遍历
如果我们得到二叉树的层数,我们也就得到了二叉树的高度 我们依次将二叉树的每一层放入队列中 然后遍历队列该层依次出队的同时,将队列的下一层入队 每弹完一层 层数加1 代码
private int getDepth2 ( TreeNode root) {
if ( root== null ) return 0 ;
Queue < TreeNode > q = new LinkedList < TreeNode > ( ) ;
int dep = 0 ;
q. offer ( root) ;
while ( ! q. isEmpty ( ) ) {
int sz = q. size ( ) ;
for ( int i= 0 ; i< sz; i++ ) {
TreeNode cur = q. poll ( ) ;
if ( cur. left!= null ) q. offer ( cur. left) ;
if ( cur. right!= null ) q. offer ( cur. right) ;
}
dep++ ;
}
return dep;
}
二叉树定义
lass TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode ( int x) {
val = x;
}
}
测试
public static void main ( String [ ] args) {
TreeNode root1 = new TreeNode ( 3 ) ;
root1. left= new TreeNode ( 9 ) ;
root1. right= new TreeNode ( 20 ) ;
root1. right. left= new TreeNode ( 15 ) ;
root1. right. right= new TreeNode ( 7 ) ;
TreeDep treeDep = new TreeDep ( ) ;
System . out. println ( "方法1树的深度为:" + treeDep. getDepth ( root1) ) ;
System . out. println ( "方法2树的深度为:" + treeDep. getDepth2 ( root1) ) ;
}
时间复杂度|空间复杂度分析
递归法是一个深度优先搜索(DFS),时间复杂度为O(2n+1)~O(n) 空间复杂度为递归堆栈,O(logn) 队列法是一个BFS,时间复杂度为O(n),BFS的空间复杂度为O(n/2)~O(n)