特徵
1、空樹是平衡二叉樹。
2、如果一棵樹不為空,並且其中所有的子樹都滿足各自的左子樹與右子樹的高度差都不超過 1。
下面介紹一個簡單應用,平衡二叉樹的相關操作以後補充。
判斷一棵二叉樹是否為平衡二叉樹
給定一顆二叉樹的頭結點 head,判斷一棵樹是否是平衡二叉樹。
1.1、左子樹是否為平衡二叉樹
1.2、記錄左子樹的深度,最深到達哪一層,記為 LH
2.1、右子樹是否為平衡二叉樹
2.2、記錄右子樹的深度,最深到達哪一層,記為 RH
3、如果左子樹或右子樹有一個不是平衡二叉樹,則整棵樹就不是平衡二叉樹
4、如果左、右子樹都是平衡二叉樹,那麼再比較兩者深度的差值,如果大於 1,那麼就不是平衡二叉樹,否則就是平衡二叉樹。
public boolean check(TreeNode root) { boolean[] res = new boolean[1]; res[0] = true; int level = 0; getHeight(root, level, res);// 獲得以根結點為頭的深度 return res[0]; } private int getHeight(TreeNode head, int level, boolean[] res) { if (head == null) return level; // 如果當前 head 為空,則返回當前所到達的深度 int LH = getHeight(head.left, level+1, res); // 獲得以當前 head 為頭的左子樹深度 if (!res[0]) return level; // 如果以當前 head 為頭的左子樹不是 AVL,直接返回當前所到達的深度 int RH = getHeight(head.right, level+1, res); // 獲得以當前 head 為頭的右子樹深度 if (!res[0]) return level; // 如果以當前 head 為頭的右子樹不是 AVL,直接返回當前所達到的深度 if (Math.abs(LH - RH) > 1) res[0] = false; // 比較以當前 head 為頭的左子樹深度和右子樹深度,如果其相差大於 1,則說明以當前 head 為頭的二叉樹不是 AVL return Math.max(LH, RH); // 最後返回當前以 head 為頭的深度 }