程式碼隨想錄——二叉樹-12.平衡二叉樹

NeroMegumi發表於2024-11-11


image

自頂向下遞迴(前序遍歷)

這種方法是一開始想到的,雖然ac了但是對於它的本質卻不清不楚,不知道時間複雜度,不知道屬於前序遍歷。

思路

首先得到root節點的左右子樹的深度(左右),若深度差絕對值大於1(中),則root為根的樹不是平衡二叉樹;
否則繼續遞迴root的左右子樹,其左右子樹都是平衡二叉樹時,root才是平衡二叉樹。

程式碼

class Solution {
public:
    int depth(TreeNode* root){
        if(root == nullptr)return 0;
        return max(depth(root->left),depth(root->right)) + 1;
    }

    bool isBalanced(TreeNode* root) {
        if(root == nullptr)return true;

        int cha = depth(root->left) - depth(root->right);
        if(cha > 1 || cha < -1)return false;

        return isBalanced(root->left) && isBalanced(root->right);
    }

};

複雜度

時間複雜度:O(n^2),n是節點個數

最壞情況,二叉樹是滿二叉樹,需要遍歷所有節點,時間複雜度O(n)
對於節點p,如果它的高度是d,則height(p)會被呼叫d次(即遍歷到它的每一個祖先節點時)。而最壞情況下,二叉樹是鏈式結構,高度為n,此時總時間複雜度為O(n^2)

自底向上遞迴(後序遍歷)

思路

image

程式碼

class Solution {
public:
    int height(TreeNode* root){
        if(root == nullptr)return 0;
        int lheight = height(root->left);
        int rheight = height(root->right);   
        //左右子樹不是平衡二叉樹就返回-1
        if(lheight == -1 || rheight == -1)return -1;
        //以root為根的樹不是平衡二叉樹也返回-1
        if(abs(lheight - rheight) > 1) return -1;
        //以root為根的樹是平衡二叉樹,則返回以root為根的樹的深度
        return max(lheight,rheight) + 1;

    }

    bool isBalanced(TreeNode* root) {
        return height(root) >= 0;
    }

};

複雜度

image

相關文章