平衡二叉树概念:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
面向对象代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
class Tree
{
public:
int data;
Tree *left,*right;
Tree(int value)//构造函数;
{
if(value>0)
data=value;
left=NULL;//这两条语句很重要,如果不写,系统不会自动生成NULL,会出错
right=NULL;
}
};
class Record_Data
{
public:
bool is_b;//如果是平衡二叉树,返回true,否则返回false;
int height;
Record_Data(bool flag,int height)
{
is_b=flag;
height=height;
}
};
Record_Data Process(Tree *head)
{
if(head==NULL)//如果结点为空,这也是这个结点也是平衡二叉树;
return Record_Data(true,0);//如果是平衡二叉树,返回true,head为空,故高度返回0
Record_Data left_data=Process(head->left);//递归判断左子树是否为平衡二叉树
if(!left_data.is_b)//如果左子树不是平衡二叉树,返回false,高度返回任何值都可以
return Record_Data(false,0);
Record_Data right_data=Process(head->right);//递归判断右子树是否为平衡二叉树
if(!right_data.is_b)//如果右子树不是平衡二叉树,返回false,高度返回值可任意
return Record_Data(false,0);
if(abs(left_data.height-right_data.height)>1)//程序来到此位置,说明前两个递归不会return,也就是说左右子树目前都是平衡二叉树,在此处判断一下左右子树的高度差是否满足平衡二叉树的要求
return Record_Data(false,0);//如果左右子树的高度差>1,非平衡二叉树,返回false;
return Record_Data(true,max(left_data.height,right_data.height)+1);//目前的树为平衡二叉树,高度返回左右子树中最大的一个再+1;
}
int main()
{
Tree *head=new Tree(1);
head->left=new Tree(2);
head->right=new Tree(3);
head->left->left=new Tree(4);
head->left->right=new Tree(5);
Record_Data r(true,0);
r=Process(head);
if(r.is_b)
printf("Yes\n");
else
printf("No\n");
return 0;
}