• 北邮1467二叉树题引起的思考


    题目描述:

            二叉排序树,也称为二叉查找树。可以是一颗空树,也可以是一颗具有如下特性的非空二叉树:


            1. 若左子树非空,则左子树上所有节点关键字值均不大于根节点的关键字值;
            2. 若右子树非空,则右子树上所有节点关键字值均不小于根节点的关键字值;
            3. 左、右子树本身也是一颗二叉排序树。


      现在给你N个关键字值各不相同的节点,要求你按顺序插入一个初始为空树的二叉排序树中,每次插入后成功后,求相应的父亲节点的关键字值,如果没有父亲节点,则输出-1。

    输入:

    输入包含多组测试数据,每组测试数据两行。
    第一行,一个数字N(N<=100),表示待插入的节点数。
    第二行,N个互不相同的正整数,表示要顺序插入节点的关键字值,这些值不超过10^8。

    输出:

    输出共N行,每次插入节点后,该节点对应的父亲节点的关键字值。

    样例输入:
    5
    2 5 1 3 4
    样例输出:
    -1
    2
    2
    5
    3

    我先Runtime Error,后Time Limit Exceed, 然后才AC;每次出问题都发现了一些问题,记录一下:
    1. RE版代码(你能看出来问题吗?)
    View Code
     1 #include <stdio.h>
     2 #include <string.h>
     3 int btree[101];
     4  
     5 int main(int argc, const char *argv[])
     6 {
     7     memset(btree, 0, 101*sizeof(int));
     8     int data, index, parent, count, i;
     9     while(scanf("%d", &count)!=EOF)
    10     {
    11          
    12         if(scanf("%d", &data)!=EOF)
    13             btree[1] = data;
    14         printf("-1\n");
    15         for(i=1;i<count;i++)
    16         {
    17             scanf("%d", &data);
    18             index = 1;
    19             while(btree[index]!=0)
    20             {
    21                 while(btree[index]!=0&&data>btree[index]) 
    22                 {
    23                     parent = btree[index];
    24                     index=2*index+1;
    25                 }   
    26                 while(btree[index]!=0&&data<btree[index])
    27                 {
    28                     parent = btree[index];
    29                     index=2*index;
    30                 }   
    31             }
    32             btree[index] = data;
    33             printf("%d\n", parent);
    34         }
    35     }
    36     return 0;
    37 }

      2.  TLE版本(问题在哪,为什么会这样,怎么改进,能看出来吗?)

    View Code
     1 #include <stdio.h>
     2 #include <string.h>
     3 typedef struct btree
     4 {
     5     unsigned int data;
     6     struct btree *lchild;
     7     struct btree *rchild;
     8 }* bstree;
     9 struct btree array[100];
    10  
    11 int main(int argc, const char *argv[])
    12 {
    13     unsigned int data;
    14     int count, current=0;
    15     bstree root, parent;
    16     memset(array, 0, 100*sizeof(struct btree));
    17     while(scanf("%d", &count)!=EOF)
    18     {
    19         if(count>0)
    20         {
    21             scanf("%du", &data);
    22             array[current].data = data;
    23             root = &(array[0]);
    24         }        
    25         printf("-1\n");
    26         for(current=1;current<count;current++)
    27         {
    28             scanf("%du", &data);
    29             array[current].data = data;
    30             parent = root;
    31             while(1)
    32             {
    33                 if(data>parent->data&&parent->rchild==0) 
    34                 {
    35                   parent->rchild = &array[current];
    36                   break;
    37                 } 
    38                 else if(data<parent->data&&parent->lchild==0)
    39                 {
    40                   parent->lchild = &array[current];
    41                   break;
    42                 }
    43                 while(data>=parent->data&&parent->rchild!=0) 
    44                 {
    45                     parent = parent->rchild;
    46                 }   
    47                 while(data<=parent->data&&parent->lchild!=0) 
    48                 {
    49                     parent = parent->lchild;
    50                 }   
    51             }
    52             printf("%d\n", parent->data);
    53         }
    54     }
    55     return 0;
    56 }
    57  

      3.  AC版本(看看和TLE版本有啥不同,效率差了十万八千里,求解惑)

    View Code
     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <string.h>
     4   
     5 struct btree
     6 {
     7     struct btree *lchild, *rchild;
     8     unsigned long int data;
     9 };
    10   
    11 struct btree* create_btree(struct btree *t, unsigned long int d, unsigned long int parent);
    12   
    13 int main()
    14 {
    15     int i, n;
    16     unsigned long int d;
    17     struct btree *t;
    18   
    19     while (scanf("%d", &n) != EOF) {
    20         t = NULL;
    21         for (i = 0; i < n; i ++) {
    22             scanf("%ld", &d);
    23             t = create_btree(t, d, -1);
    24         }
    25     }
    26   
    27     return 0;
    28 }
    29   
    30 struct btree* create_btree(struct btree *t, unsigned long int d, unsigned long int parent)
    31 {
    32     if (t == NULL) {
    33         t = (struct btree *)malloc(sizeof(struct btree));
    34         t->data = d;
    35         t->lchild = NULL;
    36         t->rchild = NULL;
    37         printf("%ld\n", parent);        
    38     }else if(t->data > d) {
    39         t->lchild = create_btree(t->lchild, d, t->data);
    40     }else if(t->data < d) {
    41         t->rchild = create_btree(t->rchild, d, t->data);
    42     }else {
    43         exit(EXIT_FAILURE);
    44     }
    45   
    46     return t;
    47 }

      RE版两个问题,在审题上,数据用int不够存,肯定有测试用例不行的;而且int btree[101]是没有道理的,其实如果这么存二叉树,100层想要无措,得要2的99次方个元素,God,思路也不对;

      TLE版的算法结果是对的,但是超时了,改成递归建树就好了,效率差了一百倍,为什么呢?

  • 相关阅读:
    用GD库生成高质量的缩略图片[转载]
    Linux流量监控工具 iftop (最全面的iftop教程)
    数据库开发数据库使用连接池
    过去时的那些硬件和软件
    关于及时回收(GC)系统资源的析构对象的的示例
    控制好节奏,踏实做好每件事
    如何管理IIS,自动创建WEB SITE,应用程序池
    数据库开发数据库的Data Base connection 简单池功能启示
    .Net MSMQ在分布式中的应用
    高并发高负载网站的系统架构注意的问题
  • 原文地址:https://www.cnblogs.com/xuangong/p/3002068.html
Copyright © 2020-2023  润新知