题目描述
利用先序递归遍历算法创建二叉树并判断该二叉树是否为完全二叉树。完全二叉树只能是同深度的满二叉树缺少最后一层倒数连续个叶子结点。先序递归遍历建立二叉树的方法为:按照先序递归遍历的思想将对二叉树结点的抽象访问具体化为根据接收的数据决定是否产生该结点从而实现创建该二叉树的二叉链表存储结构。约定二叉树结点数据为单个大写英文字符。当接收的数据是字符"#“时表示该结点不需要创建,否则创建该结点。最后判断创建完成的二叉树度是否为完全二叉树。需要注意输入数据序列中的”#“字符和非”#"字符的序列及个数关系,这会最终决定创建的二叉树的形态。
输入
输入为接受键盘输入的由大写英文字符和"#"字符构成的一个字符串(用于创建对应的二叉树)。
输出
对应的二叉树是否为完全二叉树的判断结果。若是输出"Y",否则输出"N"。
样例输入
A##
ABC####
AB##C##
ABCD###EF##G###
A##B##
ABC##D##EG###
样例输出
Y
N
Y
N
Y
Y
假设N0是度为0的结点总数(即叶子结点数),N1是度为1的结点总数,N2是度为2的结点总数,由二叉树的性质可知:N0=N2+1,则N= N0+N1+N2(其中n为完全二叉树的结点总数),由上述公式把N2消去得:N= 2N0+N1-1,由于完全二叉树中度为1的结点数只有两种可能0或1,由此得到N0=(N+1)/2或N0=N/2。
#include<bits/stdc++.h>
#define ll long long
//#define int ll
#define pii pair<int,int>
#define mem(a,b) memset(a,b,sizeof(a))
#define endl '\n'
#define N 100005
const int inf=0x3f3f3f3f;
const double pi=acos(-1.0);
using namespace std;
int con=0;//结点总数
int cc=0;//度为0的节点数
typedef struct TNodes
{
int data;
TNodes *lnode,*rnode;
}*TNode;
void Creat(TNode &t)
{
char c;
cin>>c;
if(c=='#') t=NULL;
else
{
con++;
t=new TNodes;
t->data=c;
Creat(t->lnode);
Creat(t->rnode);
}
}
void pd(TNode &t)
{
if(!t) return;
if(!t->lnode&&!t->rnode) cc++;
pd(t->lnode);
pd(t->rnode);
}
signed main()
{
TNode t;
Creat(t);
pd(t);
if(con/2==cc||(con+1)/2==cc) cout<<"Y";
else cout<<"N";
return 0;
}