1. 程式人生 > >劍指Offer——判斷平衡二叉樹

劍指Offer——判斷平衡二叉樹

題目描述:

輸入一個二叉樹的根節點,

1)求二叉樹的深度。

2)判斷該樹是不是平衡二叉樹。

二叉樹的深度:從根節點遍歷到葉節點的路徑,經過最長路徑的節點數。

平衡二叉樹:二叉樹的任意結點的左右子樹的深度相差不超過1。

struct BinaryTree
{
    int m_nvalue;
    BinaryTree *m_nleft;
    BinaryTree *m_nright;
};
//二叉樹的深度:從根節點到葉節點的最長路徑
int TreeDepth(BinaryTree *pRoot)
{
    if(pRoot==NULL)
        return 0;
    int left=TreeDepth(pRoot->m_nleft);
    int right=TreeDepth(pRoot->m_nright);

    return (left>right)?(left+1):(right+1);
}
//判斷是否為平衡二叉樹,方法一
bool IsBalanced1(BinaryTree *pRoot)
{
    if(pRoot==NULL)
        return true;

    int left,right;
    left=TreeDepth(pRoot->m_nleft);
    right=TreeDepth(pRoot->m_nright);

    int dif=left-right;
    if(dif>1&&dif<-1)
        return false;
    return IsBalanced1(pRoot->m_nleft)&&IsBalanced1(pRoot->m_nright);
}


//判斷是否為平衡二叉樹,方法二
//結點只需遍歷一次,採用後序遍歷。
bool IsBalanced2(BinaryTree *pRoot,int *pdep)
{
    if(pRoot==NULL)
    {
        *pdep=0;
        return true;
    }
    int left,right;
    if(IsBalanced2(pRoot->m_nleft,&left)&&(IsBalanced2(pRoot->m_nright,&right)))
    {
        int dif=left-right;//左右子樹的深度差值
        if(dif<1||dif>-1)
        {
            //記錄該節點的樹深
            *pdep=1+(left>right?left:right);
            return true;
        }
    }
    return false;
}