题目
思路
自顶向下
我们知道一棵平衡二叉树定义为每个节点左右两个子树的高度差的绝对值不超过1,那么我们采用自顶向下的思路是:
** 从根节点开始,比较该节点是否满足平衡二叉树的条件,然后再比较左子树和右子树是否满足平衡二叉树的条件,这是两个子问题,所以可以递归调用**
相关代码如下:
class Solution {
public:
bool isBalanced(TreeNode* root) {
if (root == NULL)
return true;
if (abs(hightlength(root->left) - hightlength(root->right)) >1 )
return false;
return isBalanced(root->left) && isBalanced(root->right);
}
//求二叉树的高度,递归调用
int hightlength(TreeNode* root) {
if (root == NULL)
return 0;
if (!root->left && !root->right)
return 1;
return max(hightlength(root->left), hightlength(root->right)) + 1;
}
};
采用自顶向下的一个缺点是:每次比较节点是否满足条件都需要计算左右子树的高度,造成了很大的冗余,所以我们可以采用自底向上的思路
自底向上
采用自底向上的思路是:我们先比较一个节点的左右子树是否满足平衡二叉树的条件,如果满足,那么我们再判断该节点是否满足条件
相关代码如下:
class Solution {
public:
bool isBalancedTreeHelper(TreeNode* root, int& height) {
if (root == NULL) {
height = 0;
return true;
}
int left, right;
if (isBalancedTreeHelper(root->left, left) && isBalancedTreeHelper(root->right, right) && abs(left - right)<2) {
height = max(left, right) + 1;
return true;
}
return false;
}
bool isBalanced(TreeNode* root) {
int height;
return isBalancedTreeHelper(root, height);
}
};
我们采用一个全局变量height来记录每个节点的高度,重点和难点在于是否理解自底向上的基本思路:
//首先递归的判断左右子树是否满足条件,然后再利用返回的左右子树高度来判断当前节点是否满足条件,若满足,则计算出该节点的高度,并返回true
int left, right;
if (isBalancedTreeHelper(root->left, left) && isBalancedTreeHelper(root->right, right) && abs(left - right)<2) {
height = max(left, right) + 1;
return true;
}