二叉樹的深度<java版>
阿新 • • 發佈:2018-12-13
二叉樹的結構
二叉樹是比較常見的一種的一種資料結構。
首先看看二叉樹的資料結構:
//由左節點和右節點以及一個節點值構成
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; } }