二叉樹的深度


二叉樹的結構

二叉樹是比較常見的一種的一種數據結構。

首先看看二叉樹的數據結構:

//由左節點和右節點以及一個節點值構成   
public class TreeNode{ TreeNode leftNode; TreeNode rightNode; int val; TreeNode(int val){ this.val=val; this.leftNode=null; this.rightNode=null; } }

正是由於二叉樹的這個結構,所以我們常用遍歷解決二叉樹的相關問題。

二叉樹的深度問題

二叉樹的深度問題主要分為兩種,最大深度和最小深度。

最大深度:即二叉樹的高度

遞歸思路:遞歸跳出條件是判斷一個節點是否是空,如果為空則跳出,如果不為空則加一繼續遞歸。最后的返回值只需返回左子樹和右子樹中的最大值。

代碼實現:

public int deepthTree(TreeNode node){
        if (node==null){
            return 0;  //遞歸跳出條件
        }
      return Math.max(deepthTree(node.leftNode),deepthTree(node.rightNode))+1;
}

非遞歸思路:采用二叉樹的層序遍歷的思想(層序遍歷為我們可以采用隊列進行輔助操作)。我們需要遍歷每層,每遍歷完一層則將level進行加一的操作。這個問題的關鍵在於如何知道每層是否遍歷完了,我們可以定義一個初始變量cur,然后將cur和每層的進入隊列的節點的size進行比較,判斷是否遍歷完這個層的最后一個節點。

代碼實現:

  public int deepthTree(TreeNode node){
        //非遞歸實現
        LinkedList<TreeNode> queue=new LinkedList<>();  //設置隊列
        queue.offer(node);  //將根節點入隊列
        TreeNode bitTree=null;  
        int level=0;
        while (!queue.isEmpty()){
            int cur=0;  //當每層遍歷完的時候,cur恢復初始值
            int length=queue.size();
            while (cur<length){
                bitTree=queue.poll();
                cur++;
                if (bitTree.leftNode!=null) {
                    queue.offer(bitTree.leftNode);
                }
                if (bitTree.rightNode!=null) {
                    queue.offer(bitTree.rightNode);
                }
            }
            level++;  //層數進行++
        }
        return level;
    }

最小深度

參考別人整理的思路:

思路:

1.沒有根節點,那結果就是0 
2.有根節點,沒有左右子樹,結果為1 
3.沒有左子樹,有右子樹。把右子樹看成一棵新的樹。 
4.沒有右子樹,有左子樹。把左子樹看成一棵新的樹。 
5.既有左子樹,又有右子樹。那就把左右子樹分別都看成新的樹,最后比較誰的最近葉子的路徑短,就取哪邊。 
---------------------  
原文:https://blog.csdn.net/sinat_35803474/article/details/70040544 

代碼實現:

 public int deepthTree(TreeNode node){
        //<--最小深度-->
        if (node==null){
            return 0;
        }
        if (node.leftNode==null && node.rightNode==null){
            return 1;
        }
        if (node.rightNode==null){
            return deepthTree(node.leftNode)+1;
        }else if (node.leftNode==null){
            return deepthTree(node.rightNode)+1;
        }else {
            return Math.min(deepthTree(node.leftNode),deepthTree(node.rightNode))+1;
        }
    }      

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM