判斷樹(shù)是否平衡

其實(shí)關(guān)于樹(shù)的好多題都是遞歸的。。

首先復(fù)習(xí)一下什么是平衡樹(shù):

平衡二叉樹(shù)

即:所有節(jié)點(diǎn)的左右子樹(shù)的高度差不超過(guò)1

思路之一:
求每個(gè)節(jié)點(diǎn)的高度
假設(shè)我們有一個(gè)getTreeDepth(TreeNode* tree )的函數(shù)
然后這樣:

bool IsBalanced(TreeNode* tree)
{
    if (tree == NULL)
        return 1;
    
    int leftHigh = getTreeDepth(tree->left);
    int rightHigh = getTreeDepth(tree->right);
    if (leftHigh - rightHigh > 1 || leftHigh - rightHigh < -1)
        return false;
    return IsBalanced(tree->left) && IsBalanced(tree->right);

}

但是呢,這個(gè)方法有一個(gè)老問(wèn)題,就是普通的遞歸求Fibnacci數(shù)列的直接調(diào)用f(n)=f(n-1)+f(n-2)這個(gè)函數(shù)會(huì)導(dǎo)致大量的重復(fù)計(jì)算,上面這個(gè)函數(shù)也是這樣,我們從根節(jié)點(diǎn)開(kāi)始算depth也是遍歷了很多次,所以我們稍稍改進(jìn)一下:

bool IsBalanced(TreeNode* tree, int* depth)
{
    if (tree == NULL)
    {
        *depth = 0;
        return true;
    }
    int left, right;
    if (IsBalanced(tree->left, &left) && IsBalanced(tree->right, &right))
    {
        int diff = left - right;
        if (diff >= -1 && diff <= 1)
        {
            *depth = (left > right ? left : right) + 1;
            return true;
        }

    }
    return false;
}

bool IsBalanced(TreeNode* tree)
{
    int depth = 0;
    return IsBalanced(tree, &depth);
}

其實(shí)思路是差不多的,只是通過(guò)遞歸的方法,從最下面開(kāi)始計(jì)算。

同樣的思路也可以求路徑長(zhǎng)呢。

文章參考何海濤大神文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容