第二十一题 递归计算树高 并判断 是否是平衡二叉树
class Solution {
public:
bool IsBalanced_Solution(TreeNode* pRoot) {
if(pRoot == NULL)
return true;
// 递归判断左右子树是不是平衡二叉树
// 定义 左右子树的高度差 最大为1
// 获得左右子树高度
int l_height=get_height(pRoot->left);
int r_height=get_height(pRoot->right);
// cout<<l_height << r_height<<endl;
// 如果高度为-1 就说明下面已经有不平衡的了,直接return false
// 否则 判断左右子树高度是否相差 大于1
if(l_height ==-1 || r_height ==-1 || abs(l_height - r_height) > 1)
return false;
else
return true;
}
// 递归 计算高度 加上判断左右子树是否平衡
// 如果不平衡 直接返回-1
int get_height(TreeNode* root)
{
int height=0;
// 递归结束条件 只有一个结点 高度为0
if(root==NULL)
return height;
// 递归调用计算左右子树的高度 (包括 是否平衡的-1)
int l_height=get_height(root->left);
int r_height=get_height(root->right);
// 如果说 有-1 则直接全部返回-1
if(l_height==-1 || r_height==-1)
return -1;
// 如果 左右子树高度相差大于1,则返回-1
// 这个判断 也就是上面所说的子树判断是否平衡、是否返回-1的问题
if(abs(l_height - r_height) > 1)
return -1;
// 如果平衡 返回 高度最大的值+1 1就是当前这一层
else
return (l_height>r_height?l_height:r_height)+1;
}
};
public:
bool IsBalanced_Solution(TreeNode* pRoot) {
if(pRoot == NULL)
return true;
// 递归判断左右子树是不是平衡二叉树
// 定义 左右子树的高度差 最大为1
// 获得左右子树高度
int l_height=get_height(pRoot->left);
int r_height=get_height(pRoot->right);
// cout<<l_height << r_height<<endl;
// 如果高度为-1 就说明下面已经有不平衡的了,直接return false
// 否则 判断左右子树高度是否相差 大于1
if(l_height ==-1 || r_height ==-1 || abs(l_height - r_height) > 1)
return false;
else
return true;
}
// 递归 计算高度 加上判断左右子树是否平衡
// 如果不平衡 直接返回-1
int get_height(TreeNode* root)
{
int height=0;
// 递归结束条件 只有一个结点 高度为0
if(root==NULL)
return height;
// 递归调用计算左右子树的高度 (包括 是否平衡的-1)
int l_height=get_height(root->left);
int r_height=get_height(root->right);
// 如果说 有-1 则直接全部返回-1
if(l_height==-1 || r_height==-1)
return -1;
// 如果 左右子树高度相差大于1,则返回-1
// 这个判断 也就是上面所说的子树判断是否平衡、是否返回-1的问题
if(abs(l_height - r_height) > 1)
return -1;
// 如果平衡 返回 高度最大的值+1 1就是当前这一层
else
return (l_height>r_height?l_height:r_height)+1;
}
};