leetcode110平衡二叉樹_C++_easy

給定一個二叉樹,判斷它是否是高度平衡的二叉樹。

本題中,一棵高度平衡二叉樹定義爲:

一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過1。

示例 1:

給定二叉樹 [3,9,20,null,null,15,7]

    3
   / \
  9  20
    /  \
   15   7
返回 true 。

示例 2:

給定二叉樹 [1,2,2,3,3,null,null,4,4]

       1
      / \
     2   2
    / \
   3   3
  / \
 4   4
返回 false 。

 

思路:根據平衡二叉樹的定義,遞歸求左右子樹是否是平衡二叉樹即可。遞歸思路三步走,第一步:判斷遞歸終止的條件是啥,第二步遞歸的參數傳啥 第三步……

判斷如果左右子樹不是平衡二叉樹,返回false,如果是判斷這棵樹的高度差是否是平衡二叉樹。

C++代碼如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int high(TreeNode* root)
    {
        int res=0;
        if(root)
        {
            res=max(high(root->left),high(root->right))+1;
        }
        return res;
    }
    bool isBalanced(TreeNode* root) {
        if(!root) return true;
        if(!root->left && !root->right) return true;
        if(isBalanced(root->left) && isBalanced(root->right))
        {
            int lh=high(root->left);
            int rh=high(root->right);
            if(abs(lh-rh) <=1)
                return true;
            else
                return false;
        }
        return false;
    }
};

不過上面的方法有個明顯的問題,就是遞歸重複太多了,重複計算很多次子樹的高度。有點浪費

所以有下面的方法:

方法是如果我們發現子樹不平衡,則不計算具體的深度,而是直接返回-1。那麼優化後的方法爲:對於每一個節點,我們通過方法遞歸獲得左右子樹的深度,如果子樹是平衡的,則返回真實的深度,若不平衡,直接返回-1,此方法時間複雜度O(N),空間複雜度O(H),參見代碼如下:空間和時間複雜度不是很會算。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int Depth(TreeNode* root) {
        if(!root) return 0;
        if(!root->left && !root->right) return 1;
        int left=Depth(root->left);
        if(left == -1) return -1;
        int right=Depth(root->right);
        if(right == -1) return -1;
        int diff=abs(left-right);
        if(diff > 1)
            return -1;
        else
            return max(left,right)+1;
    }
   
    bool isBalanced(TreeNode* root) {
        if(!root) return true;
        if(Depth(root) == -1) return false;
        else
            return true;
    }
};

參考:

https://www.cnblogs.com/grandyang/p/4045660.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章