题目:
思路:
思路很直观。后序遍历二叉树。函数参数中的max_depth保存左、右子树的最大深度。返回值是bool,判断是否符合Balanced Binary Tree条件。
代码实现:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool f(TreeNode *root, int depth, int &max_depth){
int left_max = depth, right_max = depth;
int left_ret = true, right_ret = true;
if (root->left){
left_ret = f(root->left, depth+1, left_max);
}
if (left_ret == false){
return false;
}
if (root->right){
right_ret = f(root->right, depth+1, right_max);
}
if (right_ret == false || abs(left_max-right_max) > 1){
return false;
}
if (abs(left_max-right_max) > 2){
return false;
}
max_depth = max(left_max, right_max);
return true;
}
bool isBalanced(TreeNode* root) {
if (root == nullptr){
return true;
}
int max_depth = 0;
return f(root, 1, max_depth);
}
};
另一种写法。函数返回值和函数参数调换了一下。函数返回值是树的深度,参数ans判断是否符合Balanced Binary Tree条件。思路与上面代码都一样,都是后序遍历二叉树,只是写法不一样而已。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int f(TreeNode *root, bool &ans){
if (root == nullptr){
return 0;
}
int left_depth = f(root->left, ans);
if (ans == false){
return 0;
}
int right_depth = f(root->right, ans);
if (ans == false){
return 0;
}
if (abs(left_depth - right_depth) > 1){
ans = false;
return 0;
}
ans = true;
return max(left_depth, right_depth) + 1;
}
bool isBalanced(TreeNode* root) {
if (root == nullptr){
return true;
}
bool ans = true;
f(root, ans);
return ans;
}
};
discuss:
// 自下而上求树的高度
class Solution {
public:
int dfsHeight(TreeNode *root){
if (!root) return 0;
int leftHeight = dfsHeight(root->left);
if (leftHeight == -1) return -1;
int rightHeight = dfsHeight(root->right);
if (rightHeight == -1) return -1;
if (abs(leftHeight - rightHeight) > 1) return -1;
return max(leftHeight, rightHeight) + 1;
}
bool isBalanced(TreeNode* root) {
return dfsHeight(root) != -1;
}
};