1. 程式人生 > 其它 >log4j 不動程式碼的情況下 升級為 log4j2

log4j 不動程式碼的情況下 升級為 log4j2

題目描述:

  給定一個二叉樹,判斷它是否是高度平衡的二叉樹。本題中,一棵高度平衡二叉樹定義為:一個二叉樹每個節點的左右兩個子樹的高度差的絕對值不超過 1 。

解題思路:

  注意題目中要求“每個節點”都滿足,一開始我就是沒考慮周全,寫了一個遞迴計算根節點左右子樹高度的函式,最後判斷左右子樹高度差不超過1就返回了true。大錯特錯!要想一棵二叉樹是高度平衡的二叉樹,那麼它的左右子樹必然也是高度平衡的二叉樹,而且左右子樹的高度差不超過1。這裡可以發現,有3個判定條件:

  • 左子樹是高度平衡的二叉樹;
  • 右子樹是高度平衡的二叉樹;
  • 左右子樹高度差不超過1;

自頂向下程式碼如下:

var isBalanced = function
(root) { if(!root){   return true; } if(isBalanced(root.left)&&isBalanced(root.right)){ let h = Math.abs(height(root.left)-height(root.right)); return h<2?true:false; } return false; }; function height(root){ if(!root){ return 0; } let lh
= height(root.left); let rh = height(root.right); return lh>rh?lh+1:rh+1; //返回左右子樹較高的,同時加1表示根節點也算是一層高度 }

  通過示例驗證上面程式碼計算過程會發現,每次左右子樹判定為平衡後計算它們的高度差時,會重複之前節點的高度計算。下面自底向上編寫程式碼:

var isBalanced = function(root) {
    if(!root){
        return true;
    }
    return height(root)>=0;//只要不是返回-1,就證明根節點平衡
}; function height(root){ if(!root){ return 0; } let lh = height(root.left); let rh = height(root.right); if(lh == -1||rh == -1||Math.abs(lh-rh)>1){ return -1; }else{ return Math.max(lh,rh)+1; } }