思路很简单,就是对每个节点来判断是否都是平衡二叉树即可,对于这样每个节点,我们需要求得左右子树的树高。
目录
1.自底向上
这里直接遍历一遍,设置一个函数求左右子树的高度,如果两者相差1以上,就表示不是平衡树,否则继续递归,代码如下所示:
class Solution {
public:
int height(TreeNode *root){
if(root==NULL) return 0;
int lh=height(root->left);
int rh=height(root->right);
if(lh==-1 || rh==-1){
return -1;
}
int dif=abs(lh-rh);
if(dif>1){
return -1;
}
return max(lh,rh) + 1;
}
bool IsBalanced_Solution(TreeNode* pRoot) {
if(height(pRoot)==-1){
return false;
}
return true;
}
};
2.自顶向下
如果不是自底向上,我们需要用一个哈希表来存储对应节点的树高,然后自顶向下过一遍:
class Solution {
public:
map<TreeNode*, int> hs;
int depth(TreeNode *root) {
if (!root) return 0;
if (hs.find(root) != hs.end()) return hs[root];
int ldep = depth(root->left);
int rdep = depth(root->right);
return hs[root] = max(ldep, rdep) + 1;
}
bool judge(TreeNode *root) {
if (!root) return true;
return abs(hs[root->left] - hs[root->right]) <= 1 &&
judge(root->left) && judge(root->right);
}
bool IsBalanced_Solution(TreeNode* root) {
depth(root);
return judge(root);
}
};