判斷二叉樹是否爲平衡二叉樹

一、線性思維

遍歷每個節點都時候,求左右子樹的深度,如果左右子樹深度相差不超過1,繼續遞歸遍歷左右節點,此種方法會重複遍歷,時間效率不高

IS_BALANCED(T)

        if T is NULL

                return true;


        left = TreeDepth(T.left);

        right = TreeDepth(T.right);

        diff = left - right;

        if diff > 1 or diff < -1

                return false;


        return IS_BALANCED(T.left) and IS_BALANCED(T.right);


二、帶緩存的遍歷

IS_BALANCED(T, *depth)

        if T is NULL

                depth = 0;

                return true;


        if IS_BALANCED(T.left, left) and IS_BALANCED(T.right, right)

                diff = left - right;

                if diff <= 1 and diff >= -1

                        depth = 1 + ( left > right ? left : right );

                        return true;


        return false;



轉自http://zhedahht.blog.163.com/blog/static/25411174201142733927831/



三、時間複雜度O(n),這種比較好理解

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
 
int dfsHeight(struct TreeNode* root){
    if(root == NULL)
        return 0;
        
    int leftHeight = dfsHeight(root -> left);
    if(leftHeight == -1)
        return -1;
        
    int rightHeight = dfsHeight(root -> right);
    if(rightHeight == -1)
        return -1;
        
    if(abs(leftHeight - rightHeight) > 1)
        return -1;
        
    return leftHeight > rightHeight ? leftHeight+1 : rightHeight+1;
}

bool isBalanced(struct TreeNode* root) {
    return dfsHeight(root) != -1;
}


發佈了31 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章