Problem: Check if a binary tree is balanced.
Problem Description: Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1. Give a simple solution with complexity O(logn logn)
非常直观的想法是直接使用recursion,计算left tree的高度,然后计算right tree的高度,然后check他们是不是相差大于1. 但是这样的问题是,在每一层recursion计算高度的过程中,最底层的leaf node的高度都要被重新计算,这个过程中产生了冗余的调用,这和fibonacci数列的recursion解法的问题是一样的。如果我们能有什么方法,使得对于每个node,都只计算一次高度,那么,就有更好的解法。
先给一个O(n^2)的解法:
class Solution {
public:
int getHeight( TreeNode *root )
{
if( root == NULL ) return 0;
if( root->left == NULL && root->right == NULL ) return 1;
else
return 1+ max( getHeight( root->left ), getHeight( root->right ) );
}
bool isBalanced(TreeNode *root) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if( root == NULL ) return true;
if( root->left == NULL && root->right == NULL ) return true;
if( isBalanced( root->left ) && isBalanced ( root->right ) )
{
int leftHeight = getHeight( root->left );
int rightHeight = getHeight( root->right );
if( abs( leftHeight-rightHeight ) > 1 )
return false;
else
return true;
}
else
return false;
}
};