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;
    }
    
  • 相关阅读:
    css 移动端像素,rem适配详解
    css,图片和文字在父元素垂直居中,且图片和文字在中线对齐排列的几种方式
    css弹性盒子桃园三兄弟之:flexgrow、flexshrink、flexbasis详解
    less的基本使用
    css 利用flex居中对齐
    css 高度塌陷和外边距折叠问题详解,(BFC)
    HTML行内元素、块状元素、行内块状元素的区别
    css flex弹性布局学习总结
    shell学习笔记
    Ant入门教程
  • 原文地址:https://www.cnblogs.com/aeipyuan/p/10079517.html
Copyright © 2011-2022 走看看