题目
思路
只有每个节点的左右子树高度差不超过1才是平衡二叉树,因此可以递归解决。
递归的2要素:
①终止条件:当左右子树高度差超过1时返回false;递归到空节点和叶子节点时,由于空节点和叶子节点都满足平衡二叉树的条件,所以直接返回true
②转换为子问题:判断它的左、右子树是否都为平衡二叉树。
代码
typedef struct TreeNode BTNode;
int BTreeHeight(BTNode* root)
{
if (root == NULL)
return 0;
if (root->left == NULL && root->right == NULL)
return 1;
int ret1 = BTreeHeight(root->left) + 1;
int ret2 = BTreeHeight(root->right) + 1;
return ret1 > ret2 ? ret1 : ret2;
}
bool isBalanced(struct TreeNode* root){
//空节点是平衡树
if (root == NULL)
return true;
//叶子节点也是平衡树
if (root->left == NULL && root->right == NULL)
return true;
if (abs(BTreeHeight(root->left)-BTreeHeight(root->right)) > 1)
return false;
//左、右子树都是平衡二叉树
return isBalanced(root->left) && isBalanced(root->right);
}