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;
}

浙公网安备 33010602011771号