1. 程式人生 > >二叉樹的深度<java版>

二叉樹的深度<java版>

二叉樹的結構

二叉樹是比較常見的一種的一種資料結構。

首先看看二叉樹的資料結構:

//由左節點和右節點以及一個節點值構成   
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;
        }
    }