• 1110 Complete Binary Tree


    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 (≤) 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

    题意:

      给出一棵树中各个结点的左右孩子的信息,判断这棵树是不是完全二叉树,如果是,输出最后一个结点的下标,如果不是,输出根节点的下标。

    思路:

      刚开始想的是把这棵树给构建出来,然后按照要求输出就好了,但是,这样做有三组测试样例不能通过。(找到错误的原因了,是我把字符串转数字的函数写错了,其实可以不用写的,直接用stoi()函数就好了)然后,看了一下别人的代码,发现可以不用构建树,就可以做出来。(既然我的代码已经通过了,就把我的写上去吧,哈哈哈)

    Code:

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 map<int, pair<int, int> > m;
     6 
     7 typedef struct Node* node;
     8 
     9 struct Node {
    10     int val;
    11     node left;
    12     node right;
    13     Node(int v) {
    14         val = v;
    15         left = NULL;
    16         right = NULL;
    17     }
    18 };
    19 
    20 int lastNode(node root) {
    21     queue<node> que;
    22     que.push(root);
    23     bool haveEnd = false;
    24     node temp;
    25     while (!que.empty()) {
    26         temp = que.front();
    27         que.pop();
    28         if (temp->left != NULL) {
    29             if (haveEnd) return -1;
    30             que.push(temp->left);
    31         } else
    32             haveEnd = true;
    33         if (temp->right != NULL) {
    34             if (haveEnd) return -1;
    35             que.push(temp->right);
    36         } else
    37             haveEnd = true;
    38     }
    39     return temp->val;
    40 }
    41 
    42 node buildTree(int r) {
    43     if (r < 0) return NULL;
    44     node root = new Node(r);
    45     if (m.find(r) != m.end() && m[r].first != -1) 
    46         root->left = buildTree(m[r].first);
    47     if (m.find(r) != m.end() && m[r].second != -1) 
    48         root->right = buildTree(m[r].second);
    49     return root;
    50 }
    51 
    52 int main() {
    53     int n;
    54     cin >> n;
    55     vector<bool> haveParent(n, false);
    56     for (int i = 0; i < n; ++i) {
    57         string left, right;
    58         cin >> left >> right;
    59         pair<int, int> temp = {-1, -1};
    60         if (left[0] != '-') {
    61             int l = stoi(left);
    62             haveParent[l] = true;
    63             temp.first = l;
    64         }
    65         if (right[0] != '-') {
    66             int r = stoi(right);
    67             haveParent[r] = true;
    68             temp.second = r;
    69         }
    70         m[i] = temp;
    71     }
    72 
    73     int r = 0;
    74     while(haveParent[r]) r++;
    75 
    76     node root = buildTree(r);
    77     int last = lastNode(root);
    78     if (last < 0)
    79         cout << "NO " << root->val << endl;
    80     else
    81         cout << "YES " << last << endl;
    82 
    83     return 0;
    84 }
    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    bzoj1072【SCOI2007】排列perm
    【APIO2012】【BZOJ2809】派遣dispatching
    《失控》读书笔记
    素养与修养
    [Android6.0][RK3399] 电池系统(三)电量计 CW2015 驱动流程分析【转】
    [IMX6DL][Android4.4] 电池低电量告警提示【转】
    高清摄像头MIPI CSI2接口浅解【转】
    RK3288获取摄像头的Sensor ID【原创】
    mipi LCD 的CLK时钟频率与显示分辨率及帧率的关系【转】
    android简易双屏支持【转】
  • 原文地址:https://www.cnblogs.com/h-hkai/p/12782551.html
Copyright © 2020-2023  润新知