zoukankan      html  css  js  c++  java
  • pat树之专题(30分)

    (好好复习是王道)

    1115. Counting Nodes in a BST (30)

    分析:简单题——将bst树构造出来,然后给每个节点打上高度。最后求出树的高度。然后count树高的节点数加上树高节点数-1就ok了

     1 #include <iostream>
     2 #include <cstdio>
     3 
     4 #define MAXN 1003
     5 using namespace std;
     6 typedef struct Node{
     7     int key,hight;
     8     int left,right;
     9 }Node;
    10 
    11 Node node[MAXN];
    12 int solve_hight[MAXN];
    13 int main()
    14 {
    15     int n,index1,index2,max,a,b;
    16     scanf("%d",&n);
    17 
    18     scanf("%d",&node[0].key);
    19     node[0].left=node[0].right=-1;
    20     for(int i=1;i<n;i++){
    21         scanf("%d",&node[i].key);
    22         node[i].left=node[i].right=-1;
    23         int j=0;
    24         while(1){
    25             if(node[i].key>node[j].key)
    26                 if(node[j].right!=-1)
    27                     j=node[j].right;
    28                 else
    29                     {
    30                         node[j].right=i;
    31                         break;
    32                     }
    33             else
    34                 if(node[j].left!=-1)
    35                     j=node[j].left;
    36                 else
    37                     {
    38                         node[j].left=i;
    39                         break;
    40                     }
    41             }
    42         }
    43         index1=index2=0;
    44         solve_hight[index2++]=0;
    45         node[0].hight=1;
    46         while(index1!=index2){
    47             if(node[index1].left!=-1){
    48                 solve_hight[index2++]=node[index1].left;
    49                 node[node[index1].left].hight=node[index1].hight+1;
    50             }
    51             if(node[index1].right!=-1){
    52                 solve_hight[index2++]=node[index1].right;
    53                 node[node[index1].right].hight=node[index1].hight+1;
    54             }
    55             index1++;
    56         }
    57 
    58         a=b=max=0;
    59         for(int i=0;i<n;i++){
    60             if(node[i].left==-1&&node[i].right==-1&&node[i].hight>max)max=node[i].hight;
    61         }
    62         for(int i=0;i<n;i++){
    63             if(max==node[i].hight)a++;
    64             if(max-1==node[i].hight)b++;
    65         }
    66         printf("%d + %d = %d
    ",a,b,a+b);
    67 
    68     return 0;
    69 }
    View Code

    1099. Build A Binary Search Tree (30)

    类似于上题的简单题,看来pat的题目是一年年变难,难度都被刷上去了。先构建树的框架,然后将所给序列中序遍历,最后层次遍历给出结果。每个人都要找到最适合自己,能最快写出的树的层次遍历的代码。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <algorithm>
     4 #define MAXN 105
     5 using namespace std;
     6 
     7 typedef struct Node{
     8     int left,right;
     9     Node(){
    10         left=right=-1;
    11     }
    12 }Node;
    13 Node node[MAXN];
    14 int keynum[MAXN],ans[MAXN],mid[MAXN],count_num;
    15 void mid_travel(int index){
    16     if(node[index].left!=-1)
    17         mid_travel(node[index].left);
    18 
    19     mid[count_num++]=index;
    20     if(node[index].right!=-1)
    21         mid_travel(node[index].right);
    22 
    23 }
    24 int main()
    25 {
    26     int n,index1,index2;
    27     scanf("%d",&n);
    28     for(int i=0;i<n;i++)
    29         scanf("%d%d",&node[i].left,&node[i].right);
    30     index1=index2=0;
    31     ans[index2++]=0;
    32 
    33     while(index1!=index2){
    34         if(node[ans[index1]].left!=-1)
    35             ans[index2++]=node[ans[index1]].left;
    36         if(node[ans[index1]].right!=-1)
    37             ans[index2++]=node[ans[index1]].right;
    38         index1++;
    39     }
    40     for(int i=0;i<n;i++){
    41         scanf("%d",&keynum[i]);
    42     }
    43     //得到中序遍历序列
    44     sort(keynum,keynum+n);
    45     count_num=0;
    46     mid_travel(0);
    47     bool flag=false;
    48     for(int i=0;i<n;i++){
    49         for(int j=0;j<n;j++)
    50             if(ans[i]==mid[j]){
    51                 if(!flag){
    52                     printf("%d",keynum[j]);
    53                     flag=true;
    54                 }else
    55                     printf(" %d",keynum[j]);
    56                 break;
    57             }
    58     }
    59     return 0;
    60 }
    View Code
    我要坚持一年,一年后的成功才是我想要的。
  • 相关阅读:
    body标签相关
    前端基础
    26,进程
    网络编程基础socket 重要中:TCP/UDP/七层协议
    24,内置方法的应用,(实现单利模式)
    23,反射,内置方法。
    22,hashlib(md5,和,sha算法)logging日志模块
    21,钻石继承,多态,封装,几个装饰器函数
    20,序列化模块 json,pickle,shelve
    19,面向对象
  • 原文地址:https://www.cnblogs.com/tianxia2s/p/6221414.html
Copyright © 2011-2022 走看看