考察知识点:二叉树
题目描述
输入一棵二叉树,判断该二叉树是否是平衡二叉树。
题解一
分析
当一棵二叉树的左右子树高度绝对值之差小于等于 1,则为平衡二叉树,否则不是
根据这个思路可以针对每个结点,求其子树高度是否满足条件
代码
class Solution {
public:
bool IsBalanced_Solution(TreeNode* pRoot) {
if(!pRoot)
return true;
// 如果最大左右子树高度绝对值之差大于1,则说明不是平衡二叉树
if(abs(getDepth(pRoot->left)-getDepth(pRoot->right))>1)
return false;
// 递归左子树
if(!IsBalanced_Solution(pRoot->left))
return false;
// 递归右子树
if(!IsBalanced_Solution(pRoot->right))
return false;
return true;
}
// 求最大子树高度函数
int getDepth(TreeNode* pRoot){
if(pRoot){
int left = getDepth(pRoot->left);
int right = getDepth(pRoot->right);
return max(left,right) + 1;
}
return 0;
}
};
题解二
分析
分析上一周解法,可以发现为了求树高,每个结点都会向下遍历它的子树一次
我们可以考虑优化,当发现某个结点不是平衡二叉树了,停止整个遍历
代码
class Solution {
public:
// 当返回 -1 即代表不是平衡二叉树,返回 false
bool IsBalanced_Solution(TreeNode* pRoot) {
return getDepth(pRoot) != -1 ;
}
// 当返回 -1 即代表不是平衡二叉树
// 当接受到 -1 即递归该结束了
int getDepth(TreeNode* pRoot){
if(pRoot){
int left = getDepth(pRoot->left);
if(left==-1)
return -1;
int right = getDepth(pRoot->right);
if(right == -1)
return -1;
if(abs(left-right)>1)
return -1;
return max(left,right)+1;
}
return 0;
}
};