一、线性思维
遍历每个节点都时候,求左右子树的深度,如果左右子树深度相差不超过1,继续递归遍历左右节点,此种方法会重复遍历,时间效率不高
IS_BALANCED(T)
if T is NULL
return true;
left = TreeDepth(T.left);
right = TreeDepth(T.right);
diff = left - right;
if diff > 1 or diff < -1
return false;
return IS_BALANCED(T.left) and IS_BALANCED(T.right);
二、带缓存的遍历
IS_BALANCED(T, *depth)
if T is NULL
depth = 0;
return true;
if IS_BALANCED(T.left, left) and IS_BALANCED(T.right, right)
diff = left - right;
if diff <= 1 and diff >= -1
depth = 1 + ( left > right ? left : right );
return true;
return false;
转自http://zhedahht.blog.163.com/blog/static/25411174201142733927831/
三、时间复杂度O(n),这种比较好理解
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int dfsHeight(struct TreeNode* root){
if(root == NULL)
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 leftHeight > rightHeight ? leftHeight+1 : rightHeight+1;
}
bool isBalanced(struct TreeNode* root) {
return dfsHeight(root) != -1;
}