遞歸、非遞歸求二叉樹的深度-Java

求二叉樹的深度,可以從層次遍歷的方式入手,層次遍歷用的是隊列,遍歷的條件是當前隊列是否爲空。

這裏我們用一個值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);
    }

    
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章