题目描述
给定一个二叉树,判断它是否是高度平衡的二叉树。
一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。
输入
输入一行,按照先序输入一棵二叉树,其中空节点用 -1 表示。
输出
若是则输出YES,否则输出NO。
样例输入
1 2 -1 -1 3 4 -1 -1 -1
样例输出
YES
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct BiNode{
int data;
struct BiNode *lchild;
struct BiNode *rchild;
}*BiTree;
//创建二叉树
void CreateTree(BiTree &T){
int data;
scanf("%d",&data);
if(cin.get()!='\n'){
if(data==-1){
T=NULL;
}else{
T=(BiTree)malloc(sizeof(BiNode));
T->data=data;
CreateTree(T->lchild);
CreateTree(T->rchild);
}
}
}
// 判断二叉树T是否为平衡二叉树:左右子树是平衡二叉树,平衡平衡因子为-1或者0或者1,d表示T树的高度
int JudgebalancedBiTree(BiTree T, int& d) {//【注】d的引用,及该函数的调用.
if(T==NULL) { // 空树
d = 0; // 高度为1
return 1; // 是平衡二叉树
}
int ld, rd;
if(!JudgebalancedBiTree(T->lchild, ld)) return 0; // 判断左子树不是平衡二叉树,并得到其高度
if(!JudgebalancedBiTree(T->rchild, rd)) return 0;
d = (ld>rd?ld:rd)+1; // 【注】计算T的高度,d采用引用(拿到左子树的高度,拿到右子树的高度)
return abs(ld-rd)<=1; // 到这里表示左右子树已经平衡,只要判断平衡平衡因子是否为-1, 0, 1
}
int main(void){
BiTree T;
CreateTree(T);
if(JudgebalancedBiTree(T,0)==0){
printf("NO");
}else{
printf("YES");
}
return 0;
}