zoukankan      html  css  js  c++  java
  • Just oj 2018 C语言程序设计竞赛(高级组)H: CBT?

    H: CBT?
    时间限制: 1 s      内存限制: 128 MB      提交 我的状态
    题目描述
    对于二叉树,如果这棵树的节点排布是按行从上到下,每行从左到右挨个放置,中间不会有空闲的节点。则我们称之为完全二叉树。

    注:这棵树的根节点的值一定是1

    输入
    输入数字正整数n (1≤n≤201≤n≤20)

    接下来n行,每行为两个数字(a,b)和一个字符c(L 或者 R),如果字符c是L,则表示b是a的左子节点;如果字符c是R,则表示b是a的右子节点。 (1≤a,b≤30001≤a,b≤3000)

    输出
    判断这棵树是否为完全二叉树,如果是则输出Yes,否则输出No

    样例输入
    5
    1 2 L
    1 3 R
    2 4 L
    2 5 R
    3 6 L
    样例输出
    Yes

    分析:建立一个类型P(u,k),u为该点的值,k用于选择该点的左右子结点;用map储存u点子节点的值,用队列实现从根节点开始往下再往右遍历的过程;通过改变k的值实现同一结点从左儿子到右儿子遍历的过程,左或右儿子不存在则退出循环,若通过遍历的结点数量验证是否为完全二叉树;

    #include<iostream>
    #include<string.h>
    #include<algorithm>
    #include<map>
    #include<queue>
    using namespace std;
    typedef pair<int,char>M;//用于选择左节点和右结点
    int x[3033];
    bool vis[3033];//用于寻找根节点
    map<M,int>p;//用于寻找子节点
    queue<int>q;//用于遍历树
    int main()
    {
            int n,y;
            char c;
            scanf("%d",&n);
            M tmp;
            for(int i=0;i<n;i++){
                    scanf("%d%d",&x[i],&y);
                    cin>>c;
                    tmp.first=x[i],tmp.second=c;
                    p[tmp]=y;
                    vis[y]=1;
            }
            for(int i=1;i<=n;i++)
                    if(!vis[x[i]]){
                            q.push(x[i]);break;//插入根节点
                    }
            int cnt=0;
            while(!q.empty()){
                    tmp.first=q.front();
                    q.pop();
                    tmp.second='L';
                    if(p.find(tmp)!=p.end()){
                            q.push(p[tmp]);//插入tmp的左儿子
                            cnt++;
                    }else{
                            break;
                    }
                    tmp.second='R';
                    if(p.find(tmp)!=p.end()){
                            q.push(p[tmp]);//插入tmp的左儿子
                            cnt++;
                    }else{
                            break;
                    }
            }
            cnt==n?printf("Yes
    "):printf("No
    ");
            return 0;
    }
    
  • 相关阅读:
    各种blog尝试后,发现wordpress适用起来最方便
    索引器(C# 编程指南)
    vue3 父子组件之间的传值
    vue3 + vite + ts 搭建项目
    vue3中使用全局变量
    用JSONKit库解析json文件
    程序内部让用户直接上appstore评价游戏的链接地址以及跳转方法
    常见错误:Apple MachO Linker Error
    常见错误:多线程界面元素显示错误
    常见错误:Undefined symbols for architecture i386
  • 原文地址:https://www.cnblogs.com/aeipyuan/p/10079517.html
Copyright © 2011-2022 走看看