Q: Implement a function to check if a tree is balanced. For the purposes of this question, a balanced tree is defined to be a tree such that no two leaf nodes differ in distance from the root by more than one.
A: DFS.
当前节点为node,计算其左子树的高度left,和右子树的高度right, 如果abs(left-right) > 1,则不是平衡二叉树。
为了节省时间,因为会有子问题重复计算的情况,如果子树不是平衡二叉树,则将其高度置为1
#include <iostream>
#include <cmath>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
void insert(TreeNode* root, int x){
if(root == NULL){
root = new TreeNode(x);
return;
}
if(x < root->val)
insert(root->left, x);
else
insert(root->right, x);
}
bool isBalance(TreeNode *root) {
if (!root) {
return true;
}
return isBalance(root) > -1;
}
int isBalanced(TreeNode *root) {
if (!root) {
return 0;
}
int left = isBalanced(root->left);
int right = isBalanced(root->right);
if (left < 0 || right < 0 || abs(left-right) > 1) {
return -1;
}
return max(left, right) +1;
}
int main() {
int a[10] = {5,1,2,3,4,6,7,8,9,0};
TreeNode *root = NULL;
for (int i = 0; i < 10; i++) {
insert(root, a[i]);
}
cout<<isBalance(root)<<endl;
}