log4j 不動程式碼的情況下 升級為 log4j2
阿新 • • 發佈:2022-02-25
題目描述:
給定一個二叉樹,判斷它是否是高度平衡的二叉樹。本題中,一棵高度平衡二叉樹定義為:一個二叉樹每個節點的左右兩個子樹的高度差的絕對值不超過 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; } }