题目描述:
平衡二叉树是指左右子树高度相差小于等于1的二叉树。
方法一:
思路
由题意可知平衡二叉树为左右子树高度差小于等于1,我们将问题拆解,求出左子树的高度,再求出右子树的高度,求二者相减的绝对值,大于1则返回false,判断完后,再判断其左右子树,递归下去。
解题过程
1.完成左右子树的高度计数,找到树的高度。
2.计算左右子树的差,判断是否为平衡二叉树。
3.递归下一左右子树。
代码实现:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int TreeDepth(struct TreeNode* root)
{
if(root == NULL)
{
return 0;
}
int leftDepth = TreeDepth(root->left);
int rightDepth = TreeDepth(root->right);
return leftDepth > rightDepth ?leftDepth+1:rightDepth+1;
}
//时间复杂度为O(N*N)
bool isBalanced(struct TreeNode* root) {
if(root==NULL)
return true;
int gap=TreeDepth(root->left)-TreeDepth(root->right);
if(abs(gap) > 1)
{
return false;
}
return isBalanced(root->left)&&isBalanced(root->right);
}
这个方法容易想到,但是时间复杂度太高,为O(N*N),出现了重复计算,因此我们可以选择优化这个代码,将时间复杂度变为O(N)。
方法二:
思路
这种方法利用了后序的思路,先检查左右子树,从叶子节点开始检查,依次向上检查,如果不是平衡二叉树,则返回错误,是平衡二叉树,则返回正确,同时返回高度。
解题过程
1.创建一个函数,参数有结构体和整形,因为要传递树的高度所以参数要整形。
2.函数里判断左右子树递归,判断是否为平衡二叉树,不是则返回false。
3.判断其是平衡二叉树则返回高度。
代码实现:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int _isBalanced(struct TreeNode* root,int* pdepth)
{
if(root == NULL)
return true;
else
{
int leftDepth = 0;
if(_isBalanced(root->left,&leftDepth) == false)
{
return false;
}
int rightDepth = 0;
if(_isBalanced(root->right,&rightDepth) == false)
{
return false;
}
if(abs(leftDepth-rightDepth) > 1)
{
return false;
}
*pdepth=leftDepth > rightDepth ? leftDepth+1:rightDepth+1;
return true;
}
}
//时间复杂度为O(N)
bool isBalanced(struct TreeNode* root) {
int depth = 0;
return _isBalanced(root,&depth);
}