平衡二叉树的严格定义是,一棵二叉树的任何一个结点,左子树和右子树的高度差不超过一,即为平衡二叉树。
判断是否平衡二叉树的大体思路是,以每一个结点为头结点的二叉树都是平衡二叉树,那整棵树都是平衡二叉树,
(1)判断左树是否平衡,如果不平衡返回false
(2)判断右树是否平衡,如果不平衡返回false
(3)拿到左树的高度
(4)拿到右树的高度
(5)判断左右树高度差是否超过一,超过一,返回false
下面就可以根据上述的这些信息,设计递归返回结构,遍历左树的过程,应该给我返回左树是否平衡,以及左树高度这两个信息。右树需要返回的信息也一样,所以整理出递归函数的返回值,应该包括高度,和是否平衡这两个信息
下面看代码:
class isBalancedTree{
private:
class Node{
public:
int value;
Node *left;
Node *right;
Node(int data){
this->value=data;
}
};
class returnData{
public:
bool isBalance;
int h;
returnData(bool isB,int h){
this->isBalance=isB;
this->h=h;
}
};
returnData process(Node *head){
if(head== nullptr)
return returnData(true,0);
returnData leftData =process(head->left);
if(!leftData.isBalance)
return returnData(false,0);
returnData rightData=process(head->right);
if(!leftData.isBalance)
return returnData(false,0);
if(abs(leftData.h - rightData.h)>1)
return returnData(false,0);
return returnData(true,max(leftData.h,rightData.h)+1);
}
bool isB(Node *head){
return process(head).isBalance;
}
};