天梯赛练习——是否完全二叉搜索树 (30分)

题目:

天梯赛练习——是否完全二叉搜索树 (30分)_第1张图片

分析:

使用递归建立二叉搜索树,在建树完成之后,使用队列层次遍历该树,定义一个标志 pp,对于每一个结点,如果该节点的左子树为空但是右子树不为空的情况,这说明该树不是完全二叉树,将 pp 置为true,这样就可以判否是完全二叉树

代码:

#include 
#include 
#include 
#include 
using namespace std;

int n,ind;
int num[25],ans[25];

typedef struct node* TE;
struct node
{
    int val;
    TE l = NULL,r = NULL;
};

TE BuildTree(TE tre,int val)
{
    if(tre == NULL)
    {
        TE tt = new node();
        tt->val = val;
        return tt;
    }
    if(val > tre->val)
        tre->l = BuildTree(tre->l,val);
    else
        tre->r = BuildTree(tre->r,val);
    return tre;
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
        scanf("%d",&num[i]);
    TE tree = NULL;
    for(int i=1;i<=n;++i)
        tree = BuildTree(tree,num[i]);
    queue<TE> q;
    bool flag = false,pp = false;;
    q.push(tree);
    while(!q.empty())
    {
        TE now = q.front();
        q.pop();
        ans[++ind] = now->val;
        if(now->l != NULL)
            q.push(now->l);
        else
            flag = true;
        if(now->r != NULL)
        {
            q.push(now->r);
            if(flag)
                pp = true;
        }
        else
            flag = true;
    }
    for(int i=1;i<=ind;++i)
        if(i == ind)
            printf("%d\n",ans[i]);
        else
            printf("%d ",ans[i]);
    if(pp)
        printf("NO\n");
    else
        printf("YES\n");
    return 0;
}

你可能感兴趣的:(#,天梯赛,#,二叉树)