《程序員面試金典》

4.1 檢查二叉樹是否平衡

代碼實現
// 獲取二叉樹的樹高度,判斷二叉樹是否平衡
class TreeNode {
    public int val = 0;
    public TreeNode left = null;
    public TreeNode right = null;
}

public class Solution {
    // 獲取樹高度,用遞歸的方法:左、右子樹的最大高度加一
    public static int getHeight(TreeNode node) {
        if (node == null) // 遞歸結束條件
            return 0;
        else // 左右子樹的最大高度加一
            return Math.max(getHeight(node.left), getHeight(node.right))+1;
    }

    // 遞歸判斷樹是否平衡:先判斷當前節點是否平衡,平衡時再判斷左右子樹是否平衡
    public static boolean isBalance(TreeNode node) {
        if (node == null) // 遞歸結束條件
            return true;

        // 獲取左右子樹高度,判斷當前節點是否平衡
        int left = getHeight(node.left);
        int right = getHeight(node.right);

        if (Math.abs(left - right) > 1) // 遞歸結束條件
            return false;
        else
            return isBalance(node.left) && isBalance(node.right);
    }

    // 改進方法,從根節點遞歸向下檢查每棵子樹的高度
    public static boolean isBalance2(TreeNode root) {
        if (checkHeight(root) == -1)
            return false;
        else
            return true;
    }

    public static int checkHeight(TreeNode node) {
        if (node == null)
            return 0;

        // 獲取左子樹高度,並判斷是否平衡
        int leftHeight = checkHeight(node.left);
        if (leftHeight  == -1)
            return -1;

        // 獲取右子樹高度,並判斷是否平衡
        int rightHeight = checkHeight(node.right);
        if (leftHeight  == -1)
            return -1;

        // 檢查當前節點是否平衡
        if (Math.abs(leftHeight - rightHeight) > 1)
            return -1;
        else
            return Math.max(checkHeight(node.left), checkHeight(node.right)) + 1;

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