• PAT 1110 Complete Binary Tree[比较]


    1110 Complete Binary Tree (25 分)

    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 N1. 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

     题目大意:给出一个二叉树,判断是否是完全二叉树。

    //这个题真的学到了不少东西。我的AC:

    参照了:https://blog.csdn.net/hyf20144055065/article/details/51970789

    #include <iostream>
    #include <algorithm>
    #include<cstdio>
    #include<stdio.h>
    #include <queue>
    #include<cmath>
    #include <vector>
    using namespace std;
    struct Node{
        int left=-1,right=-1;
    }node[20];
    int isr[20];
    int root=-1;
    int ct=0,n,last=0;
    void level(int r){//进行层次遍历。我是选择在入队的时候+,但是这样是比较复杂的,我应该在出队的时候+。
        queue<int> qu;
        qu.push(r);
        //ct++;
        while(!qu.empty()){
            //if(ct==n)last=qu.back();
            int top=qu.front();qu.pop();
            if(top==-1)break;
            last=top;//每次last都赋值为当前。
            ct++;
    //        if(node[top].left==-1)break;
    //        else {
    //            qu.push(node[top].left);
    //            ct++;
    //        }
            qu.push(node[top].left);//其实这里-1完全可以push进去,因为下一次再次弹出时会进行判断的。
            qu.push(node[top].right);
    //        if(node[top].left!=-1){
    //            qu.push(node[top].right);
    //            ct++;
    //        }
        }
    }
    
    int main()
    {
        cin>>n;
        string l,r;
        for(int i=0;i<n;i++){
            cin>>l>>r;
            if(l!="-"){
                node[i].left=atoi(l.c_str());//注意这里的转换
                //cout<<node[i].left<<'
    ';
                isr[node[i].left]=1;
            }
            if(r!="-"){
                node[i].right=atoi(r.c_str());
                isr[node[i].right]=1;
            }
        }
        for(int i=0;i<n;i++){
            if(isr[i]==0){
                root=i;break;
            }
        }
        level(root);
        if(ct==n)
            cout<<"YES "<<last;
        else
            cout<<"NO "<<root;
        return 0;
    }

    1.利用完全二叉树的性质来判断。

    2。使用了层次遍历,但是我的层次遍历思路是不正确的。

    3.我的思路:只要有左子节点就push进去,然后计数+1,是在入队的时候计算数量。只要左子节点为-1,那么就break掉。

    4.正确思路:当节点左右为空-1时,可以push进去,在whlle循环中会进行判断,如果是-1,那么就break了,是在出队的时候进行+1操作,这样最后就可以了

    5.在我原来的那种方法中,2和6测试点过不去,对于6测试点:

    使用了

    1

    - -

    测试数据进行了更正

    2测试点是对于0的检测。

    正确输出应该是YES  0

  • 相关阅读:
    正则表达式
    HDU 2066 多源最短路
    UVA 11039 模拟
    Concrete Mathematics Chapter 1 Warmups
    List differences between JAVA and C++
    uva 11107Life Forms
    poj 1509 Glass Beads
    poj 3581
    网络流建图
    图论算法----网络流
  • 原文地址:https://www.cnblogs.com/BlueBlueSea/p/9939813.html
Copyright © 2020-2023  润新知