求二叉树的深度,可以从层次遍历的方式入手,层次遍历用的是队列,遍历的条件是当前队列是否为空。
这里我们用一个值nums记录当前层的节点数,另一个值nextnums记录下一层的节点数,一个值deepth记录深度。
外层循环为while,本层结点数不为0.
内层循环用for,循环本层中所有结点。
nextnums每次循环开始的时候为0,遇到本层中结点有左孩子就加1,有右孩子也加1
for循环结束后更新num值,deepth+1即可
import java.util.LinkedList;
class TreeNode{
TreeNode left = null;
TreeNode right = null;
public int data = 0;
TreeNode(int data){
this.data = data;
}
}
public class MaxDeepthOfTree {
//递归版
public static int getMaxDeepthNaN(TreeNode root){
if(root == null){
return 0;
}
return Math.max(getMaxDeepthNaN(root.left)+1, getMaxDeepthNaN(root.right)+1 );
}
//非递归版
public static int getMaxDeepth(TreeNode root){
if(root == null) return 0;
int deepth = 0; //深度
LinkedList<TreeNode> l = new LinkedList<TreeNode>();
l.add(root);
int nums = 1; //当前层结点的个数
while(nums != 0){ //每层一次
deepth++;
int nextNums = 0;//下一层结点的个数
for(int i = 0; i < nums; i++){
TreeNode node = l.removeFirst();
if(node.left != null){
nextNums++;
l.add(node.left);
}
if(node.right != null){
nextNums++;
l.add(node.right);
}
}
nums = nextNums;
}
return deepth;
}
public static void main(String[] args) {
TreeNode t1 = new TreeNode(1);
TreeNode t2 = new TreeNode(2);
TreeNode t3 = new TreeNode(3);
TreeNode t4 = new TreeNode(4);
TreeNode t5 = new TreeNode(5);
TreeNode t6 = new TreeNode(6);
TreeNode t7 = new TreeNode(7);
t1.left = t2;
t2.left = t3;
t2.right = t4;
t4.left = t5;
t5.right = t6;
t6.right = t7;
int maxDeepth = getMaxDeepth(t1);
int maxDeepthNan = getMaxDeepthNaN(t1);
System.out.println(maxDeepth);
System.out.println(maxDeepthNan);
}
}