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.
recursion...
1.The first method checks whether the tree is balanced strictly according to the definition of balanced binary tree: the difference
between the heights of the two sub trees are not bigger than 1, and both the left sub tree and right sub tree are also balanced. With the helper function depth(), we could easily write the code;
/**
* 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:
bool isBalanced(TreeNode* root) {
if (!root)
return true;
if(abs(maxDepth(root->left)-maxDepth(root->right)) > 1)
return false;
else
return isBalanced(root->left) && isBalanced(root->right);
}
int maxDepth(TreeNode* root) {
if(root)
return 1 + max(maxDepth(root->left), maxDepth(root->right));
else
return 0;
}
};
For the current node root, calling depth() for its left and right children actually has to access all of its children,
thus the complexity is O(N). We do this for each node in the tree, so the overall complexity of isBalanced will be O(N^2). This is a top down approach.
2.The second method is based on DFS. Instead of calling depth() explicitly for each child node, we return
the height of the current node in DFS recursion. When the sub tree of the current node (inclusive) is balanced, the function dfsHeight() returns a non-negative value as the height. Otherwise -1 is returned. According to the leftHeight and rightHeight of the
two children, the parent node could check if the sub tree
is balanced, and decides its return value.
class Solution {
public:
int dfsHeight(TreeNode *root){
if(!root)
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 max(leftheight, rightheight) + 1;
}
bool isBalanced(TreeNode *root) {
if(!root)return true;
else
return dfsHeight(root) != -1;
}
};
In this bottom up approach, each node in the tree only need to be accessed once. Thus the time complexity is
O(N), better than the first solution.