1. 程式人生 > 實用技巧 >習題:Complete the Projects (hard version)(揹包DP&貪心)

習題:Complete the Projects (hard version)(揹包DP&貪心)

平衡二叉樹

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

示例

給定二叉樹 [3,9,20,null,null,15,7]

    3
   / \
  9  20
    /  \
   15   7

返回 true。
給定二叉樹 [1,2,2,3,3,null,null,4,4]

       1
      / \
     2   2
    / \
   3   3
  / \
 4   4

返回 false。

題解

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
var isBalanced = function(root) {
    var target = true;
    var dfs = function(root){
        if(!root) return 0;
        if(!target) return 0;
        var l = dfs(root.left);
        var r = dfs(root.right);
        if(Math.abs(l-r)>1) target = false;
        return l > r ? l+1 : r+1;
    }
    dfs(root);
    return target;
};

思路

定義一個深度遞迴遍歷的函式,在一個節點中獲取樹的左右子樹的高度,也就是定義獲取樹的高度的函式,在獲取左右子樹的高度時比較左右子樹是否平衡即可,首先定義目標變數target,之後定義深度遞迴遍歷dfs函式,在函式中判斷節點不存在則返回0,接下來是一部分剪枝,如果已經找到了不平衡的位置那麼就沒有必要繼續向下遍歷,之後定義l為左子樹的高度,r為右子樹的高度,之後進行比較如果做右子樹的高度差大於1則認為其不是平衡二叉樹,賦值targetfalse,之後返回做右子樹中高的子樹的高度+1,執行dfs深度遞迴遍歷,完成後返回target即可。

每日一題

https://github.com/WindrunnerMax/EveryDay

參考

https://leetcode-cn.com/problems/balanced-binary-tree/