题目描述
输入一棵二叉树,判断该二叉树是否是平衡二叉树。
思路:平衡二叉树只满足树的平衡,但它不一定是排好序的二叉搜索树,因此在这里可以采用递归的方式,从叶子结点向根节点搜索,若发现有父节点的左右节点深度相差大于1,则返回false,若无则返回true,继续遍历,知道达到根节点。
代码:
class Solution {
public:
bool IsBalanced_Solution(TreeNode* pRoot) {
int depth = 0;
return getDepth(pRoot, depth);
}
bool getDepth(TreeNode* root, int& depth) {
if(root == NULL) return true;
int left = 0;
int right = 0;
if(getDepth(root->left, left) && getDepth(root->right, right)) {
int dif = left - right;
if(dif < -1 || dif > 1) {
return false;
}
depth = max(left, right) + 1;
return true;
}
return false;
}
};
以上方法是经过优化的,我最开始想到的方法是,结合getDepth()函数,在递归求解数的深度的时候,判断是否产生不平衡的情况,若是则修改全局变量isBalance为false,递归完后返回全局变量isBalance即可。
该方法的缺点在于,在已找到非平衡情况后,仍需要继续递归并判断,很明显这样代码执行起来速度更慢。
原始代码:
class Solution {
public:
bool isBalance = true;
bool IsBalanced_Solution(TreeNode* pRoot) {
int x = getDepth(pRoot);
return isBalance;
}
int getDepth(TreeNode* root) {
if(root == NULL) return 0;
int left = getDepth(root->left);
int right = getDepth(root->right);
if(abs(left - right) > 1)
isBalance = false;
return max(left, right)+1;
}
};