zoukankan      html  css  js  c++  java
  • PAT1110:Complete Binary Tree

    1110. Complete Binary Tree (25)

    时间限制
    400 ms
    内存限制
    65536 kB
    代码长度限制
    16000 B
    判题程序
    Standard
    作者
    CHEN, Yue

    Given a tree, you are supposed to tell if it is a complete binary tree.

    Input Specification:

    Each input file contains one test case. For each case, the first line gives a positive integer N (<=20) which is the total number of nodes in the tree -- and hence the nodes are numbered from 0 to N-1. Then N lines follow, each corresponds to a node, and gives the indices of the left and right children of the node. If the child does not exist, a "-" will be put at the position. Any pair of children are separated by a space.

    Output Specification:

    For each case, print in one line "YES" and the index of the last node if the tree is a complete binary tree, or "NO" and the index of the root if not. There must be exactly one space separating the word and the number.

    Sample Input 1:
    9
    7 8
    - -
    - -
    - -
    0 1
    2 3
    4 5
    - -
    - -
    
    Sample Output 1:
    YES 8
    
    Sample Input 2:
    8
    - -
    4 5
    0 6
    - -
    2 3
    - 7
    - -
    - -
    
    Sample Output 2:
    NO 1

    思路
    判断一棵二叉树是不是完全二叉树。

    层次遍历二叉树,当遍历到"-"节点时(表示空节点),检查树的节点数N和遍历次数cnt是否相等,相等yes,不想等no。
    注意:输入用string而不用char,因为char不能表示两位数以上的数字。之前没注意导致代码只有部分ac。

    代码

     

    #include<iostream>
    #include<vector>
    #include<queue>
    using namespace std;
    
    class Node
    {
    public:
        int left;
        int right;
    };
    int main()
    {
        int N;
        while(cin >> N)
        {
          vector<Node> nodes(N);
          vector<bool> isroot(N,true);
          //Build tree
          for(int i = 0;i < N;i++)
          {
              string left,right;
              cin >> left >> right;
              if(left == "-")
                nodes[i].left = -1;
              else
              {
                nodes[i].left = stoi(left);
                isroot[nodes[i].left] = false;
              }
              if(right == "-")
                nodes[i].right = -1;
              else
              {
                nodes[i].right = stoi(right);
                isroot[nodes[i].right] = false;
              }
          }
          //Find root
          int root = -1;
          for(int i = 0;i < isroot.size();i++)
          {
              if(isroot[i])
              {
                root = i;
                break;
              }
          }
          //BFS
          queue<int> q;
          q.push(root);
          int cnt = 0,lastindex = -1;
          while(!q.empty())
          {
              int tmp = q.front();
              q.pop();
              if(tmp == -1)
              {
                  break;
              }
              cnt++;
              lastindex = tmp;
              q.push(nodes[tmp].left);
              q.push(nodes[tmp].right);
          }
          //Output
          if(cnt == N)
            cout << "YES" << " " << lastindex <<endl;
          else
            cout << "NO" << " " << root << endl;
        }
    }
    

      

  • 相关阅读:
    7.15 更改累计和中的值
    7.10 计算中间值
    7.11 求总和的百分比
    7.9 计算模式
    7.8 计算累计差
    7.4 求一个表的行数
    7.6 生成累计和
    7.7 生成累积乘积
    7.2 求某列中的最小、最大值
    7.3 对某列的值求和
  • 原文地址:https://www.cnblogs.com/0kk470/p/7784384.html
Copyright © 2011-2022 走看看