p28 判断二叉树是否平衡 (leetcode 110)

一:解题思路

这道题有2种解题方法。

第一种就是递归法,从根节点开始,自定向下开始遍历二叉树,这样对树中的节点就会有很多重复遍历的,导致算法的时间复杂度不高。算法时间复杂度为n*log(n),当树只有一边的时候,递归调用深度为最深。算法的空间复杂度为:O(n)。

第二种方法在于改进第一种方法,第一种方法之所以效率不高的原因是重复遍历了很多的树节点。那么我们就可以直接从至底向上的方法来遍历二叉树,如果子树不平衡,那么直接返回false即可,就不需要重复遍历了。

二:完整代码示例 (C++版和Java版)

递归法C++

class Solution 
 {
 public:
     int max(int a, int b) { return a > b ? a : b; }

     int getHeight(TreeNode* root)
     {
         if (root == NULL) return 0;

         int left = getHeight(root->left);
         int right = getHeight(root->right);

         return max(left,right) + 1;
     }

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

         return (abs(getHeight(root->left) - getHeight(root->right)) <= 1) && isBalanced(root->left) && isBalanced(root->right);
     }
 };

递归法Java:

class Solution {
    public int getHeight(TreeNode root)
     {
         if(root==null) return 0;
         
         int left=getHeight(root.left);
         int right=getHeight(root.right);
         
         return Math.max(left,right)+1;
     }
     
    public boolean isBalanced(TreeNode root)
    {
          if(root==null) return true;
          
          return Math.abs(getHeight(root.left)-getHeight(root.right))<=1 &&isBalanced(root.left)&& isBalanced(root.right);
    }
}

迭代法C++:

 class Solution 
 {
 public:
     int max(int a, int b) { return a > b ? a : b; }

     int getHeightAndCheck(TreeNode* root)
     {
         if (root == NULL) return 0;

         int left = getHeightAndCheck(root->left);
         if (left == -1) return -1;

         int right = getHeightAndCheck(root->right);
         if (right == -1) return -1;

         if (abs(left-right) > 1) return -1;

         return max(left,right) + 1;
     }

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

         return getHeightAndCheck(root)!=-1;
     }
 };

迭代法Java:

public int getHeightCheck(TreeNode root)
     {
         if(root==null) return 0;

         int left=getHeightCheck(root.left);
         if(left==-1) return -1;
         
         int right=getHeightCheck(root.right);
         if(right==-1) return -1;
         
         if(Math.abs(left-right)>1) return -1;

         return Math.max(left,right)+1;
     }

    public boolean isBalanced(TreeNode root)
    {
          if(root==null) return true;

          return getHeightCheck(root)!=-1;
    }

  

posted @ 2020-03-13 17:16  repinkply  阅读(134)  评论(0)    收藏  举报