求二叉樹的深度,可以從層次遍歷的方式入手,層次遍歷用的是隊列,遍歷的條件是當前隊列是否爲空。
這裏我們用一個值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);
}
}