题目要求
输入一棵二叉树,判断该二叉树是否是平衡二叉树。
平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树
解题分析
基于第55题【剑指offer】面试题55 二叉树的深度的基础,我们可以分别求出左右子树的深度,然后判断深度差是否大于1即可,但是这个解法我们可以想到有一些节点会重复遍历很多次,所以为了避免这个问题我们可以采用“从下到上的”遍历方法,并且在遍历的时候适当的采取剪枝,如果发现左右子树有不是平衡二叉树的立即停止。
主要代码c++
class Solution {
public:
bool IsBalanced_Solution(TreeNode* pRoot) {
return getDepth(pRoot) != -1;
}
private:
int getDepth(TreeNode* pRoot)
{
if(pRoot == nullptr) return 0;
int left = getDepth(pRoot->left);
if(left == -1) return -1; // 发现不符合要求的马上返回
int right = getDepth(pRoot->right);
if(right == -1) return -1;
return abs(left-right)>1 ? -1 : max(left,right) + 1; //-1来作为非法标记
}
};
剑指offer 上的解法
// 用一个变量 记录深度
class Solution {
public:
bool IsBalanced_Solution(TreeNode* pRoot) {
int depth = 0;
return IsBalanced(pRoot, depth);
}
private:
bool IsBalanced(TreeNode* pRoot, int &depth)
{
if(pRoot == nullptr)
{
depth = 0;
return true;
}
int left,right;
if(IsBalanced(pRoot->left, left) && IsBalanced(pRoot->right, right))
{
int diff = left - right;
if(diff <= 1 && diff >= -1)
{
depth = max(1+left, 1+right);
return true;
}
}
return false;
}
};