输入一棵二叉树,判断该二叉树是否是平衡二叉树。
平衡二叉树性质:
是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
思路:
方法一(不合适,需要重复遍历节点多次,耗时长O(n^2)))
bool isBalanced(TreeNode* pRoot){
if(pRoot == NULL)
return true;
int left = maxDepth(pRoot->left);
int right = maxDepth(pRoot->right);
int diff = left-right;
if(diff <-1 || diff >1)
return false;
return isBalanced(pRoot->left)&&isBalanced(pRoot->right);
}
方法二:
用后序遍历的方式遍历整棵二叉树。在遍历某节点的左、右子节点之后,我们可以根据它的左、右子节点的深度判断它是不是平衡的,并得到当前节点的深度。当最后遍历到树的根节点的时候,也就判断了整棵二叉树是不是平衡二叉树。
//后续遍历时,遍历到一个节点,其左右子树已经遍历 依次自底向上判断,每个节点只需要遍历一次
class Solution {
public:
bool IsBalanced_Solution(TreeNode* pRoot) {
int depth = 0;
return isBalanced(pRoot,depth);
}
bool isBalanced(TreeNode* pRoot,int &depth){
if(pRoot == NULL)
return true;
int left = 0;
int right = 0;
if(isBalanced(pRoot->left,left) && isBalanced(pRoot->right,right)){
int dif = left-right;
if(dif < -1 || dif > 1)
return false;
depth = left > right?(left+1):(right+1);
return true;
}
return false;
}
};