递归套路:找出所有的可能性 。然后写代码。
ResTreeNode* isBalance(TreeNode* head){
//注意 空树是一颗高度为0的平衡二叉树
if(head == nullptr){
return new ResTreeNode(true,0);
}
ResTreeNode* left_t = isBalance(head->left);
if(!left_t->isB){
return new ResTreeNode(false,0);
}
ResTreeNode* right_t = isBalance(head->right);
if(!right_t->isB){
return new ResTreeNode(false,0);
}
if(abs(left_t->high - right_t->high) > 1){
return new ResTreeNode(false, 0);
}
return new ResTreeNode(true,left_t->high - right_t->high);
}
bool judge(TreeNode* head){
return isBalance(head)->isB;
}
全代码:
#include<iostream>
#include<algorithm>
using namespace std;
struct TreeNode{
int value;
TreeNode* left;
TreeNode* right;
};
struct ResTreeNode{
bool isB;
int high;
ResTreeNode(bool b, int h){
isB = b;
high = h;
}
};
ResTreeNode* isBalance(TreeNode* head){
//注意 空树是一颗高度为0的平衡二叉树
if(head == nullptr){
return new ResTreeNode(true,0);
}
ResTreeNode* left_t = isBalance(head->left);
if(!left_t->isB){
return new ResTreeNode(false,0);
}
ResTreeNode* right_t = isBalance(head->right);
if(!right_t->isB){
return new ResTreeNode(false,0);
}
if(abs(left_t->high - right_t->high) > 1){
return new ResTreeNode(false, 0);
}
return new ResTreeNode(true,left_t->high - right_t->high);
}
bool judge(TreeNode* head){
return isBalance(head)->isB;
}
string getTreeWithSerial(TreeNode* head){
if(head == nullptr){
return "#_";
}
char c[8];
sprintf(c,"%d",head->value);
string s = c;
s = s+ '_';
string s1 = getTreeWithSerial(head->left);
string s2 = getTreeWithSerial(head->right);
return s + s1 + s2;
}
TreeNode* getTree(int arr[],int length,int i){
if(i < length){
TreeNode* Treenode = new TreeNode();
Treenode->value = arr[i];
if((2*i+1) < length){
Treenode->left = getTree(arr, length, 2*i+1);
}else{
Treenode->left = nullptr;
}
if((2*i+2)<length){
Treenode->right = getTree(arr, length,2*i+2);
}else{
Treenode->right = nullptr;
}
return Treenode;
}
return nullptr;
}
int main(){
int arr[] = {5,3,8,2,4,6,9,1};
// int arr[] = {1,2,3};
int length = sizeof(arr)/sizeof(arr[0]);
//建树
TreeNode* head = getTree(arr, length,0);
//前序查看建树是否正确
string str = getTreeWithSerial(head);
//查看是否是平衡二叉树
cout << judge(head);
// cout <<str;
// cout << head->right->value;
return 0;
}