一、線性思維
遍歷每個節點都時候,求左右子樹的深度,如果左右子樹深度相差不超過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;
}