《劍指offer》——平衡二叉樹

更多2019年的技術文章,歡迎關注我的微信公衆號:碼不停蹄的小鼠松(微信號:busy_squirrel),也可掃下方二維碼關注獲取最新文章哦~

T:

題目描述
輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。

該題目我想了好久,總是想在一個遞歸函數內解決這個問題,最後沒能找出解決方案。

本題的關鍵在於兩個部分的求解:

  1. 要計算每個節點的深度(或者計算該節點兩個孩子節點的深度);
  2. 根據兩個子節點的深度差判斷該以該節點爲子樹的結構是否爲平衡二叉樹。

第一個問題的求解,就需要遞歸解決,第二個問題,也要遞歸解決。

比如:

節點a的兩個子節點的深度差小於等於1,還要繼續看兩個子節點是否各自滿足這個條件,即對每個子節點來說,其兩個子節點是否也滿足深度差小於等於1,如此遞歸下去,直到葉節點。

兩個問題,就需要兩個遞歸函數,各自執行各自的功能,而問題2的求解依賴於問題1的答案。

code:

	/**
	 * T: 平衡二叉樹
	 * 
	 * 題目描述 
	 * 輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。
	 * 
	 * date: 2015.11.21  17:14
	 * @author SSS
	 *
	 */
	public class Solution {
	    
	    /**
		 * 該函數的功能:
		 * 判斷當前節點的左右節點其高度差是否大於1.
		 * 當大於1的時候返回false;
		 * 當不大於1的時候,要看其兩個子節點是否也滿足該條件。
		 * @param root
		 * @return
		 */
	    public boolean IsBalanced_Solution(TreeNode root) {
	        if (root == null) {
				return true;
			}
	        
	        int leftDepth = this.getDepth(root.left);
	        int rightDepth = this.getDepth(root.right);
	        
	        if (Math.abs(leftDepth - rightDepth) > 1) {
				return false;
			}
	        
	        return IsBalanced_Solution(root.left) && IsBalanced_Solution(root.right);
	    }
	    
	    /**
		 * 該函數的功能:當前節點爲根節點的子樹的深度
		 * @param rootTreeNode
		 * @return
		 */
		public int getDepth(TreeNode rootTreeNode) {
			if (rootTreeNode == null) {
				return 0;
			}
			
			int leftDepth = getDepth(rootTreeNode.left);
			int rightDepth = getDepth(rootTreeNode.right);
			
			int depth = Math.max(leftDepth, rightDepth);
			return depth + 1;
		}
	}

更多2019年的技術文章,歡迎關注我的微信公衆號:碼不停蹄的小鼠松(微信號:busy_squirrel),也可掃下方二維碼關注獲取最新文章哦~

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