【剑指offer】39 - 平衡二叉树

题目描述
  • 输入一棵二叉树,判断该二叉树是否是平衡二叉树。
  • 平衡二叉树:即左右子树的高度差不超过1
  • 如下图所示:
    平衡二叉树
  • 如上图所示:(a)树左右子树的高度均为3,高度差为0<1,所以平衡;(b)树左右子树的高度分别为3和2,高度差为1<=1,所以平衡;(c)树左右子树的高度差分别为3和1,高度差2>1,所以不平衡
  • 注意:我们所说的平衡二叉树,即这棵树每一颗子树都是平衡二叉树
  • 二叉树节点定义如下:
struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
解题思路
  • 既然平衡二叉树的判定和树的高度有关,那么我们首先要会求树的高度,大家可以点这里二叉树的深度查看我的博文,这里不再详述
  • 如果我们求得左右子树的高度,那么可以通过计算左右子树高度的绝对值来进行判断,若大于1,直接返回false;否则返回true
  • 上面这种思路,我们用一个全局变量来标记当前子树是否是平衡二叉树,但是若是判断为不是并没有直接返回,而是一直遍历完整棵树,整合这个标记,然后返回,这样若是递归的最深层子树就不平衡,那么后面的判断都是没有必要的
  • 所以,我们应该向办法让从下向上遍历过程中,若有子树不平衡,则直接返回,这样可以建少不必要的开销
  • 思路理清楚之后,我们就可以写代码了
代码实现
  • 解法一:遍历完所有节点后返回结果
//通过设置全局的bool类型的变量来记录当前子树是否为平衡二叉树
bool isBalance = true;
int TreeDepth(TreeNode* pRoot)
{
    if(pRoot == NULL)
        return 0;
    int left = TreeDepth(pRoot->left);
    int right = TreeDepth(pRoot->right);

    //通过左右子树的高度差来判断是否为平衡二叉树
    if(abs(left - right) > 1)
        isBalance = false;

    return left > right ? left+1 : right+1;
}

bool IsBalanced_Solution(TreeNode* pRoot) 
{
    TreeDepth(pRoot);
    return isBalance;

}
  • 解法二:遍历过程中若判断不平衡则直接返回
int TreeDepth(TreeNode* pRoot)
{
    if (pRoot == NULL)
        return 0;
    int left = TreeDepth(pRoot->left);
    if (left == -1)
        return -1;

    int right = TreeDepth(pRoot->right);
    if (right == -1)
        return -1;
    return abs(left - right) > 1 ? -1 : max(left, right) + 1;
}

bool IsBalanced_Solution(TreeNode* pRoot)
{
    return TreeDepth(pRoot) != -1;
}

猜你喜欢

转载自blog.csdn.net/Aurora_pole/article/details/81582691