1. 程式人生 > 其它 >劍指 offer程式碼解析——面試題39判斷平衡二叉樹

劍指 offer程式碼解析——面試題39判斷平衡二叉樹

題目:輸入一顆二叉樹的根結點,判斷該樹是不是平衡二叉樹。

如果某二叉樹中任意結點的左右子樹的高度相差不超過1,那麼它就是一棵平衡二叉樹。

分析:所謂平衡二叉樹就是要確保每個結點的左子樹與右子樹的高度差在-1到1之間。

由於之前一題已經給出了二叉樹高度的計算方法,因此本題最直觀的思路就是分別計算每個結點的左子樹高和右子樹高,從而判斷一棵樹的所有結點是否均為平衡二叉樹。

/**
 * 題目:輸入一顆二叉樹的根結點,判斷該樹是不是平衡二叉樹。
 * 如果某二叉樹中任意結點的左右子樹的高度相差不超過1,那麼它就是一棵平衡二叉樹。
 * @author 大閒人柴毛毛
 * @date 2016年4月2日
 */
public class BalanceTree {
	/**
	 * 分析:所謂平衡二叉樹就是要確保每個結點的左子樹與右子樹的高度差在-1到1之間。
	 * 由於之前一題已經給出了二叉樹高度的計算方法,因此本題最直觀的思路就是分別計算每個結點的左子樹高和右子樹高,從而判斷一棵樹的所有結點是否均為平衡二叉樹。
	 * 程式碼如下:
	 */
	
	public static <T> boolean isBalanceTree_1(Node<T> root){
		//健壯性判斷:若樹為空
		if(root==null){
			System.out.println("樹為空!");
			return true;
		}
		
		// 計算左子樹高
		int left_height = TreeHeight.getTreeHeight(root.left);
		// 計算右子樹高
		int right_height = TreeHeight.getTreeHeight(root.right);
		// 計算高度差
		int mid = left_height - right_height;
		// 判斷高度差是否為-1、0、1
		if (mid == -1 || mid == 0 || mid == 1)
			// 若當前結點是平衡二叉樹,則計算左子樹和右子樹是否為平衡二叉樹
			return (isBalanceTree_1(root.left) && isBalanceTree_1(root.right));
		// 若當前結點不是二叉平衡樹,則返回false
		else
			return false;
	}
	
	
	
	
	/**
	 * 測試
	 */
	public static void main(String[] args){
		//構造一棵平衡二叉樹
		Node<Integer> node1 = new Node<Integer>();
		Node<Integer> node2 = new Node<Integer>();
		Node<Integer> node3 = new Node<Integer>();
		Node<Integer> node4 = new Node<Integer>();
		Node<Integer> node5 = new Node<Integer>();
		Node<Integer> node6 = new Node<Integer>();
		Node<Integer> node7 = new Node<Integer>();
		Node<Integer> node8 = new Node<Integer>();
		Node<Integer> node9 = new Node<Integer>();
		
		node1.data = 1;
		node2.data = 2;
		node3.data = 3;
		node4.data = 4;
		node5.data = 5;
		node6.data = 6;
		node7.data = 7;
		node8.data = 8;
		node9.data = 9;
		
		node1.left = node2;
		node1.right = node3;
		node2.left = node4;
		node2.right = node5;
		node5.left = node7;
		node3.right = node6;
//		node7.left = node8;
//		node8.left = node9;
		
		System.out.println(isBalanceTree_1(node1));
	}
}