在此分享一下对求解树自底向上遍历并剪枝,时空复杂均为O(n)的方案。
遍历过程中遇见第一个不平衡节点将立即返回,因此在面对问题最终解不平衡时,实际的时空复杂会有一定优化效果。
/**
* 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) {
return deterBalan(root) != -1;
}
private:
int deterBalan(TreeNode* root){
if(!root) return 0;
int left_depth = deterBalan(root->left);
//遇见不平衡节点将立即返回
if(left_depth == -1){
return -1;
}
int right_depth = deterBalan(root->right);
//遇见不平衡节点将立即返回
if(right_depth == -1){
return -1;
}
//不平衡节点判别条件
if(abs(left_depth - right_depth) > 1)
return -1;
return max(left_depth, right_depth)+1;
}
};