習題:Complete the Projects (hard version)(揹包DP&貪心)
阿新 • • 發佈:2020-08-24
平衡二叉樹
給定一個二叉樹,判斷它是否是高度平衡的二叉樹。本題中,一棵高度平衡二叉樹定義為:一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過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
則認為其不是平衡二叉樹,賦值target
為false
,之後返回做右子樹中高的子樹的高度+1
,執行dfs
深度遞迴遍歷,完成後返回target
即可。
每日一題
https://github.com/WindrunnerMax/EveryDay
參考
https://leetcode-cn.com/problems/balanced-binary-tree/