1. 程式人生 > 實用技巧 >面試題55_2:平衡二叉樹

面試題55_2:平衡二叉樹

輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。

在這裡,我們只需要考慮其平衡性,不需要考慮其是不是排序二叉樹

解題思路

  • 根據上一個題目“求二叉樹的深度”,遍歷每一個節點的左右子樹深度
  • 通過“後序遍歷”的特點,每個節點只需要遍歷一次

上程式碼(C++很香)

法一:根據上一個題目“求二叉樹的深度”,遍歷每一個節點的左右子樹深度(每個節點可能會被遍歷多次)
int maxD = 0;

void dfs(TreeNode* pNode, int depth){
    // 葉子節點
    if(pNode->left == nullptr && pNode->right == nullptr){
        if(depth > maxD)
            maxD = depth;
        return ;
    }
    if(pNode->left != nullptr)
        dfs(pNode->left, depth + 1);
    if(pNode->right != nullptr)
        dfs(pNode->right, depth + 1);
}

int TreeDepth(TreeNode* pRoot){

    if(pRoot == nullptr)
        return 0;

    dfs(pRoot, 1);
    return maxD;
}

bool IsBalanced_Solution(TreeNode* pRoot){
    if(pRoot == nullptr)
        return true;

    int left = TreeDepth(pRoot->left);
    maxD= 0;
    int right = TreeDepth(pRoot->right);
    maxD = 0;
    int diff = abs(left - right);
    if(diff > 1)
        return false;
    return IsBalanced_Solution(pRoot->left) && IsBalanced_Solution(pRoot->right);
}
法二:通過“後序遍歷”的特點,每個節點只需要遍歷一次
bool IsBalanced(TreeNode* pRoot, int* pDepth){
    if(pRoot == nullptr){
        *pDepth = 0;
        return true;
    }

    // 妙啊
    int left, right;
    if(IsBalanced(pRoot->left, &left) && IsBalanced(pRoot->right, &right)){
        int diff = left - right;
        if(diff <= 1 && diff >= -1)
        {
            *pDepth = 1 + (left > right ? left : right);
            return true;
        }
    }

    return false;
}

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