[互联网面试笔试汇总C/C++-16] 判断一棵二叉树是否是平衡二叉树

首先,看一下平衡二叉树的定义:

平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。


思路:利用递归的思想


代码

int DepthTree(BSTreeNode *pbs)  
{  
    if (pbs==NULL)  
        return 0;  
    else  
    {  
        int leftLength=DepthTree(pbs->left);  
        int rigthLength=DepthTree(pbs->right);  
        return 1+(leftLength>rigthLength ? leftLength:rigthLength);  
    }  
}  
  
bool isBalanceTree(BSTreeNode *pbs)  
{  
    if (pbs==NULL)  
    {  
        return true;  
    }  
      
    int depthLeft=DepthTree(pbs->left);  
    int depthRight=DepthTree(pbs->right);  
      
    if (abs(depthLeft-depthRight)>1)   
         return false;  
    else  
        return isBalanceTree(pbs->left) && isBalanceTree(pbs->right);  
}  

改进:这样实际上是有很多重复计算的,如果想进一步提高效率的话则需要考虑如何每个结点只遍历一次。

其实就是一边遍历一遍进行判断。

代码:

bool isBalanceTree(Node* pRoot, int * pDepth)
{
    if(pRoot==NULL)
    {
        *pDepth = 0;
        return true;
    }
    int right,left;
    if(isBalanceTree(pRoot->left,&left)&&isBalanceTree(pRoot->right,&right))
    {
        if(left-right < 1 && right-left < 1)
        {
            pDepth = 1 + (left>right)?left:right;
            return true;
        }
    }
return false;
}

方法一和方法二,一个是从上往下进行判断,一个是从下往上进行判断,一个有很多重复,一个没有重复,读者可以自己体会。

    原文作者:平衡二叉树
    原文地址: https://blog.csdn.net/alexander_xfl/article/details/12839279
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞