题目描述
输入一棵二叉树,判断该二叉树是否是平衡二叉树。
算法:
平衡二叉树的定义:平衡二叉树是一棵空树或者是左右子树高度差的绝对值不超过1的树,平衡二叉树的子树也是平衡二叉树。
我们采用后续遍历的方式,要判断一棵二叉树是不是平衡二叉树,先判断他的左右子树是不是平衡二叉树,并返回左右子树的高度。
1、如果左右子树中有一个不是平衡二叉树,那么这棵树就不是平衡的
2、如果左右子树都是平衡的,再判断左右子树的高度差来决定以当前节点为根的树是不是平衡的。
bool IsBalanced_Solution(TreeNode* pRoot) {
if (NULL == pRoot){
return true;
}
int height = 0;
bool balance = false;
IsBaLanced_Solution(pRoot, height, balance);
return balance;
}
void IsBaLanced_Solution(TreeNode* pRoot, int &height, bool &balance){ //判断以pRoot所指的节点为根的树是不是平衡的,返回bool值balance表示是否平衡,并返回树的高度
if (pRoot == NULL){
height = 0;
balance = true;
return;
}
int leftH = 0;
int rightH = 0;
bool leftB = false;
bool rightB = false;
IsBaLanced_Solution(pRoot->left, leftH, leftB);
IsBaLanced_Solution(pRoot->right, rightH, rightB);
if (leftB && rightB){
if (abs(leftH - rightH) <= 1){
height = (leftH > rightH ? leftH : rightH) + 1;
balance = true;
}
else {
balance = false;
}
}
else {
balance = false;
}
return;
}
if (NULL == pRoot){
return true;
}
int height = 0;
bool balance = false;
IsBaLanced_Solution(pRoot, height, balance);
return balance;
}
void IsBaLanced_Solution(TreeNode* pRoot, int &height, bool &balance){ //判断以pRoot所指的节点为根的树是不是平衡的,返回bool值balance表示是否平衡,并返回树的高度
if (pRoot == NULL){
height = 0;
balance = true;
return;
}
int leftH = 0;
int rightH = 0;
bool leftB = false;
bool rightB = false;
IsBaLanced_Solution(pRoot->left, leftH, leftB);
IsBaLanced_Solution(pRoot->right, rightH, rightB);
if (leftB && rightB){
if (abs(leftH - rightH) <= 1){
height = (leftH > rightH ? leftH : rightH) + 1;
balance = true;
}
else {
balance = false;
}
}
else {
balance = false;
}
return;
}
下面的代码与上面的思想是一样的。这里通过这道题对函数参数及其返回值,做个小的总结。因为,之前做题都是直接看别人的代码,自己不熟练,别人怎么写,自己就这么写。再者对函数参数功能理解不透彻,通过解题思路来看函数参数和函数返回值如何设置,为今后做题提供借鉴。
在这道题目中,我们要判断一棵二叉树是否为平衡二叉树。判断的依据是平衡的二叉树的左、右子树是平衡的,并且左右子树的高度差不超过1。
那么最自然的想法就是先判断左右子树是否为平衡二叉树,在判断当前子树是否为平衡二叉树。那么判断左右子树是否为平衡二叉树时,其实就是判断一个二叉树是否为平衡二叉树(递归的思想)。这个判断的结果可以用函数返回值来给出树是否为平衡的。
那么,在判断完左右子树后,就要判断根节点了。这里的判断需要左右子树的高度。难道再去递归求左右子树的高度吗?这里就需要设定一个函数参数,并且这个参数是引用形式。在判断左右子树的同时,返回左右子树的高度。这样一举两得。
class Balance {
public:
bool isBalance(TreeNode* root) {
// write code here
if (NULL == root){
return true;
}
int height;
return isBalance(root, height);
}
bool isBalance(TreeNode* root, int &height){
if (root == NULL){
return true;
height=0;
}
int leftH = 0;
int rightH = 0;
bool balaLeft = true;
bool balaRight = true;
balaLeft = isBalance(root->left, leftH);
balaRight = isBalance(root->right, rightH);
height = leftH > rightH ? (leftH + 1) : (rightH + 1);
return (balaLeft && balaRight && (abs(leftH - rightH) <= 1));
}
};
public:
bool isBalance(TreeNode* root) {
// write code here
if (NULL == root){
return true;
}
int height;
return isBalance(root, height);
}
bool isBalance(TreeNode* root, int &height){
if (root == NULL){
return true;
height=0;
}
int leftH = 0;
int rightH = 0;
bool balaLeft = true;
bool balaRight = true;
balaLeft = isBalance(root->left, leftH);
balaRight = isBalance(root->right, rightH);
height = leftH > rightH ? (leftH + 1) : (rightH + 1);
return (balaLeft && balaRight && (abs(leftH - rightH) <= 1));
}
};