平衡二叉树
题目
思路与代码实现
常规解法:
int max(int a,int b){return a>b?a:b;}int maxDepth(struct TreeNode* root)
{if(root==NULL)return 0;return 1+max(maxDepth(root->left),maxDepth(root->right));
}bool isBalanced(struct TreeNode* root)
{if(root==NULL)return true;if(abs(maxDepth(root->left)-maxDepth(root->right))>=2)return false;return isBalanced(root->left)&&isBalanced(root->right);
}
常规解法虽然能解决问题,但是仔细地看,该算法时间复杂度达到了O(N*N)。
主要原因是重复步骤太多,可以看出该遍历方式是前序遍历,我们每次比较当前高度差是否符合“平衡”时,都需要层层计算其子树高度,这样当我们再次来算他子树高度时,有些步骤显得冗余。
举个例子:求A的高度就需要求B的高度,求B的高度就需要求C的高度…然后在求B的高度时又需要求C的高度…这样就做了许多重复工作
所以这个时候我们可以就行后序遍历,即层递归到求叶子结点高度,然后在求完下层高度后在求上层高度,再求上层高度时将下层的高度返回到上层,这样上层就无需在做一些求下层高度的冗余操作。
具体优化代码:
int max(int a,int b){return a>b?a:b;}int maxDepth(struct TreeNode* root)
{if(root==NULL)return 0;return 1+max(maxDepth(root->left),maxDepth(root->right));
}bool _isBalanced(struct TreeNode* root,int* pDepth)
{if(root==NULL){*pDepth=0;return true;}int leftDepth=0;if(_isBalanced(root->left,&leftDepth)==false)return false;int rightDepth=0;if(_isBalanced(root->right,&rightDepth)==false)return false;if(abs(leftDepth-rightDepth)>1)return false;*pDepth=1+max(leftDepth,rightDepth);return true;
}bool isBalanced(struct TreeNode* root)
{int depth=0;return _isBalanced(root,&depth);
}
此时时间复杂度就达到了O(N)