思路一:自上而下
具体思路:
一结点平衡==左孩子平衡&&右孩子平衡&&左孩子高度和右孩子高度差值的绝对值<=1。
class Solution {
public:
unordered_map<TreeNode*, int> hash; //记录每个结点的高度
int dfs(TreeNode* root) {
if (root == nullptr) return 0;
if (hash.count(root)) return hash[root];
return hash[root] = max(dfs(root->left), dfs(root->right)) + 1;
}
bool balace(TreeNode* root) {
if (root == nullptr) return true;
return abs(dfs(root->left) - dfs(root->right)) <= 1 && balace(root->left) && balace(root->right);
}
bool isBalanced(TreeNode* root) {
if (root == nullptr) return true;
return balace(root);
}
};
优化:由于在计算的过程中存在很多子问题,所以加 记忆化
思路二: 自下而上
return -1表示不平衡 ,否则return 的是某节点的高度。
class Solution {
public:
int dfs(TreeNode* root) {
if (root == nullptr) return 0;
int l = dfs(root->left);
if (l == -1) return -1;
int r = dfs(root->right);
if (r == -1 || abs(l - r) > 1) return -1;
return max(l, r) + 1;
}
bool isBalanced(TreeNode* root) {
return dfs(root) >= 0;
}
};