平衡二叉树
题目描述
输入一棵二叉树,判断该二叉树是否是平衡二叉树。
解题思路
- 后续遍历二叉树,求左右子树深度,判断是否平衡
- 带有剪枝的做法,只要发现不是平衡的,就直接停止
class Solution {
public:
//自顶向下许多节点会重复遍历,改成自底向上,左-右-根的顺序,即后序遍历
bool IsBalanced_Solution(TreeNode* pRoot) {
int depth=0;
return IsBalanced(pRoot,&depth);
}
bool IsBalanced(TreeNode* pRoot,int *depth){
if(pRoot==NULL){
*depth=0;
return true;
}
int left=0,right=0;
if(IsBalanced(pRoot->left,&left)&&IsBalanced(pRoot->right,&right)){
int dif=left-right;
if(dif<=1&&dif>=-1){
*depth=max(left,right)+1;
return true;
}
}
return false;
}
};
剪枝的做法:
class Solution {
public:
//自顶向下许多节点会重复遍历,改成自底向上,左-右-根的顺序,即后序遍历
//带有剪枝的做法
bool IsBalanced_Solution(TreeNode *root) {
return getDepth(root) != -1;
}
int getDepth(TreeNode *root) {
if (root == NULL) return 0;
int left = getDepth(root->left);
if (left == -1) return -1;
int right = getDepth(root->right);
if (right == -1) return -1;
return abs(left - right) > 1 ? -1 : 1 + max(left, right);
}
};