//完全二叉树
//判断是否为完全二叉树
//思想:采用层次遍历,将所有的结点入队(包括空结点),当遇见空结点时,查看其后面的结点是否有非空结点,
//若有非结点,则不是完全二叉树
bool isComplete(Tree T)
{
queue<Tree> Q;
Tree p;
if(T == NULL)
return true;
Q.push(T);//根节点入队
while(!Q.empty())
{
p = Q.front();//队头出队
Q.pop();
if(p)
{
//左右孩子结点入队列
Q.push(T->lchild);
Q.push(T->rchild);
}
else
{
while(!Q.empty())
{
p = Q.front();//队头出队
Q.pop();
if(p)
return false;
}
}//end else
}//end while
return true;
}//end isComplete
/*
平衡二叉树
*/
//判断是否为二叉排序树
typedef struct BSTNode{
int data;
BiNode *lchild,*rchild;
}BSTNode,*BSTTree;
int predata = -32767;
int judgeBST(BSTTree bt)
{
int bl = 0,br = 0;//用已记录左右子树是否为二叉排序树
if(bt == NULL)//空树是二叉排序树
return 1;
else{
bl = judgeBST(bt->lchild);//递归判断左子树
if(bl == 0||predata>=bt->data)//左子树不是二叉排序树,或则不满足二叉排序树的定义
return 0;
predata = bt->data;//更新
br = judgeBST(bt->rchild);//递归判断右子树
return br;
}
}//end judgeBST
/*
判断是否为平衡二叉树
思想:递归统计左右子树的高度差{-1,0,1}之间
采用后序遍递归遍历
*/
void judgeAVL(Tree bt,int &balance,int &h)//balance 为平衡因子
{
int bl=0,br = 0;//左右子树的平衡因子
int hl=0,hr = 0;//左右子树的高度
if(bt == NULL)//空树为平衡二叉树
{
balance = 1;
h =0;//树的高度为0
return;
}
else if(bt->lchild == NULL&&bt->rchild == NULL)//只有一个节点
{
h =1;
balance = 1;
return ;
}
else{
judgeAVL(bt->lchild,bl,hl);//递归判断左子树
judgeAVL(bt->rchild,br,hr);//递归判断右子树
h = (h1>hr?hl:hr) +1;
if(abs(hl-hr)<2)//计算平衡因子
balance = bl&&br;//左右子树都是平衡二叉树时这颗树才是平衡二叉树
else
balance = 0;
}//end else
}//end judgeAVL