给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
思路
- 如何遍历判断每个结点?
- 首先判断本结点是否左右平衡
- 再递归调用,遍历所有的结点并判断左右是否平衡
return isBalanced(root->left) && isBalanced(root->right);
- 如何判断左右是否平衡?
- 求得左树和右树的高度maxDepth (psOJ:求树的高度/深度 (递归) —— 二叉树
int rightDepth = maxDepth(root->left);
int leftDepth = maxDepth(root->right);
- 再得两树高度差gapDepth
解:
int maxDepth(struct TreeNode* root) {
if (!root)
return 0;
if ((root->left == NULL) && (root->right == NULL))
return 1;
int LeftDepth = maxDepth(root->left) + 1;
int RightDepth = maxDepth(root->right) + 1;
if (LeftDepth > RightDepth)
return LeftDepth;
return RightDepth;
}
int gapDepth(struct TreeNode* root)
{
if (!root)
return 0;
int rightDepth = maxDepth(root->left);
int leftDepth = maxDepth(root->right);
if (rightDepth > leftDepth)
return rightDepth - leftDepth;
return leftDepth - rightDepth;
}
bool isBalanced(struct TreeNode* root)
{
if (!root)
return true;
if (gapDepth(root) > 1)
return false;
return isBalanced(root->left) && isBalanced(root->right);
}