pta 是否完全二叉搜索树 (树的遍历)

来源:互联网 发布:单片机 如何打印二维码 编辑:程序博客网 时间:2024/04/27 21:39


将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果。

输入格式:

输入第一行给出一个不超过20的正整数N;第二行给出N个互不相同的正整数,其间以空格分隔。

输出格式:

将输入的N个正整数顺序插入一个初始为空的二叉搜索树。在第一行中输出结果树的层序遍历结果,数字间以1个空格分隔,行的首尾不得有多余空格。第二行输出YES,如果该树是完全二叉树;否则输出NO

输入样例1:

938 45 42 24 58 30 67 12 51

输出样例1:

38 45 24 58 42 30 12 67 51YES

输入样例2:

838 24 12 45 58 67 42 51

输出样例2:

38 45 24 58 42 12 67 51NO

解题思路:

建立好二叉搜索树后,我们去层序遍历这颗树,遍历的时候我们可以完成两项操作,第一项操作就是题目要求的按层序遍历输出这颗树每个节点的值,第二项操作就是去验证当前节点是否符合完全二叉树的要求。一个节点符合完全二叉树的要求有三种情况:

1.左子树和右子树都非空

2.当之后的节点都不存在儿子的时候,当前节点只存在左儿子

3.当之后的节点都存在儿子的时候,当前节点没有儿子。


最后两种情况需要特判一下,不然就掉分。


代码:

#include <bits/stdc++.h>using namespace std;const double eps=1e-4;struct p{    int x;    p*l;    p*r;};p* que[44];int n;void build(int x, p*&root){    if(root==NULL)    {        root=(p*)malloc(sizeof(p));        root->x=x;        root->l=root->r=NULL;        return;    }    if(root->x>x)    {        build(x, root->r);    }    else build(x, root->l);    return;}int top;void cx(p*q){    int head=0, tail=0;    que[tail++]=q;    p*root;    while(head<tail)    {        root=que[head];        printf(head==n-1?"%d\n":"%d ", root->x);        if(tail>=n)if(root->l==NULL && root->r==NULL)top++;//后续节点都没有儿子的时候判断当前节点两个儿子都不存在的情况        if(root->l!=NULL && root->r!=NULL)top++;        if(tail==n-1 &&(root->l!=NULL && root->r==NULL))top++; //后续节点都没有儿子且前面的节点都存在两个儿子的时候判断当前节点的只存在一个左儿子的情况        if(root->l)        {            que[tail++]=root->l;        }        if(root->r)        {            que[tail++]=root->r;        }        head++;    }    return;}int main(){    cin>>n;    int i, j, x;    p*root=(p*)malloc(sizeof(p));    scanf("%d", &x);    root->x=x;    root->l=root->r=NULL;    for(i=1; i<n; i++)    {        scanf("%d", &x);        build(x, root);    }    top=0;    cx(root);    if(top>=n)printf("YES\n");//    else if(top==n-1)printf("YES\n");    else printf("NO\n");    return 0;}



0 0
原创粉丝点击