完全二叉树定义:一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。
所以判断完全二叉树须满足两个条件:
1所有叶子节点处的深度均为二叉树的深度
2不存在只有右孩子而没有孩子的节点
求深度即可,主要是递归有点绕
递归一次,深度加一,返回一次,深度减一
#include<iostream>
using namespace std;
#define ElemType char
struct BiTree {
ElemType data;
BiTree* Lchild, * Rchild;
};
void createBiTree(BiTree* &T)
{
ElemType temp;
temp = getchar();
if (temp == '#')
{
T = NULL;
}
else
{
T = new BiTree;
T->data = temp;
createBiTree(T->Lchild);
createBiTree(T->Rchild);
}
}
void InOrder(BiTree* T)
{
if (T)
{
InOrder(T->Lchild);
cout << T->data;
InOrder(T->Rchild);
}
}
void Deepth(BiTree* T,int& temp, int& n)
{
if (T)
{
temp++;
Deepth(T->Lchild,temp,n);
Deepth(T->Rchild,temp,n);
}
else
{
if (temp > n)
n = temp;
temp--;
}
}
void IsBest(BiTree* T, int &n, int &temp,bool &temp1)
{
if (T)
{
temp++;
if (T->Lchild == NULL && T->Rchild!=NULL)
temp1 = false;
IsBest(T->Lchild, temp, n,temp1);
IsBest(T->Rchild, temp, n,temp1);
}
else
{
if (temp != n)
temp1 = false;
temp--;
}
}
int main()
{
BiTree* T;
bool temp1=true;
T = NULL;
int temp, n;
temp = 0;
n = 0;
createBiTree(T);
InOrder(T);
Deepth(T, temp, n);
temp = 0;
cout << n;
IsBest(T, n, temp,temp1);
if (!temp1)
cout << "no";
else
cout << "yes";
return 0;
}