将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果。
输入格式:
输入第一行给出一个不超过20的正整数N;第二行给出N个互不相同的正整数,其间以空格分隔。
输出格式:
将输入的N个正整数顺序插入一个初始为空的二叉搜索树。在第一行中输出结果树的层序遍历结果,数字间以1个空格分隔,行的首尾不得有多余空格。第二行输出YES,如果该树是完全二叉树;否则输出NO。
输入样例1:
9
38 45 42 24 58 30 67 12 51
输出样例1:
38 45 24 58 42 30 12 67 51
YES
输入样例2:
8
38 24 12 45 58 67 42 51
输出样例2:
38 45 24 58 42 12 67 51
NO
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
答案:
# include<stdio.h>
# include<stdlib.h>
typedef struct TNode* BinTree;
typedef struct TNode
{
int Data;
BinTree Left, Right;
}TNode;//这种写法相当于把结构体'struct TNode'重命名为'TNode',后面开辟内存空间时使用会更简单。
BinTree Insert(BinTree T, int x)
{
if (!T)
{
T = (BinTree)malloc(sizeof(TNode));
T->Data = x;
T->Left = T->Right = NULL;
}
else
{
if (x > T->Data)T->Left = Insert(T->Left, x);
else if (x < T->Data)T->Right = Insert(T->Right, x);
}
return T;
}
/*Insert的第二种写法。不过需要改变一下主函数中的用法。
Insert(BinTree* T, int x)
{
if (!*T)
{
BinTree p = (BinTree)malloc(sizeof(TNode));
p->Data = x;
p->Left = p->Right = NULL;
*T = p;
}
else
{
if (x > (*T)->Data)Insert(&(*T)->Left, x);
else if (x < (*T)->Data)Insert(&(*T)->Right, x);
}
}
*/
Print(BinTree T)
{
BinTree Queue[30], p;
int front = 0, rear = 0;
if (T)
{
Queue[rear++] = T;
while (front != rear)
{
p = Queue[front++];
if (front == 1)printf("%d", p->Data);//因为行的首尾不得有多余空格,所以要这样处理。
else printf(" %d", p->Data);
if (p->Left)Queue[rear++] = p->Left;
if (p->Right)Queue[rear++] = p->Right;
}
}
}
Judge(BinTree T)
{
BinTree Queue[30], p;
int front = 0, rear = 0;
int flag = 0;
if (T)
{
Queue[rear++] = T;
while (front != rear)
{
p = Queue[front++];
if (!p->Left && p->Right)
{
printf("NO\n");
return;
}
if (p->Left && p->Right)
{
Queue[rear++] = p->Left;
Queue[rear++] = p->Right;
}
if (p->Left && !p->Right)
{
flag = 1;
Queue[rear++] = p->Left;
}
if (!p->Left && !p->Right)flag = 1;
while (flag && front != rear)
{
p = Queue[front++];
if (p->Left || p->Right)
{
printf("NO\n");
return;
}
}
}
printf("YES\n");
}
}
int main()
{
int n;
scanf("%d", &n);
BinTree T = NULL;
int x;
for (int i = 0; i < n; i++)
{
scanf("%d", &x);
T = Insert(T, x);
}
Print(T);
printf("\n");
Judge(T);
return 0;
}