zoukankan      html  css  js  c++  java
  • 题目1201:二叉排序树

    时间限制:1 秒

    内存限制:32 兆

    特殊判题:

    提交:3260

    解决:1385

    题目描述:

        输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历。

    输入:

        输入第一行包括一个整数n(1<=n<=100)。
        接下来的一行包括n个整数。

    输出:

        可能有多组测试数据,对于每组数据,将题目所给数据建立一个二叉排序树,并对二叉排序树进行前序、中序和后序遍历。
        每种遍历结果输出一行。每行最后一个数据之后有一个空格。

    样例输入:
    5
    1 6 5 9 8
    样例输出:
    1 6 5 9 8 
    1 5 6 8 9 
    5 8 9 6 1 
    提示:

    输入中可能有重复元素,但是输出的二叉树遍历序列中重复元素不用输出。

    来源:
    2005年华中科技大学计算机保研机试真题
    下面是cpp的代码,参考朋友的。尽量改成c
    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    using namespace std;
    struct node
    {
        int key;
        node *lc;
        node *rc;
    };
    void Insert(int x,node *&p)
    {
        if(p==NULL)
        {
            p=new node;
            p->key=x;
            p->lc=NULL;
            p->rc=NULL;
        }
        else if(p->key>x)
            Insert(x,p->lc);
        else if(p->key<x)
            Insert(x,p->rc);
        else if(p->key==x)return ;
    }
    node* create(int n)
    {
        int a;
        node* F=NULL;
        while(n--)
        {
            cin >>a;
            Insert(a,F);
        }
        return F;
    }
    void pre_order(node * p)
    {
        if(p!=NULL)
        {
            cout << p->key << " ";
            pre_order(p->lc);
            pre_order(p->rc);
        }
    }
    void in_order(node * p)
    {
        if(p!=NULL)
        {
            in_order(p->lc);
            cout << p->key << " ";
            in_order(p->rc);
        }
    }
    void post_order(node * p)
    {
        if(p!=NULL)
        {
            post_order(p->lc);
            post_order(p->rc);
             cout << p->key << " ";
        }
    }
    void Free(node * p)
    {
        if(p!=NULL)
        {
            Free(p->lc);
            Free(p->rc);
            free(p);
        }
    }
    int main()
    {
        int n;
        while(scanf("%d",&n)!=EOF)
        {
            node *R=create(n);
            pre_order(R);
            cout << endl;
            in_order(R);
            cout << endl;
            post_order(R);
            cout << endl;
            Free(R);
        }
        return 0;
    }

    下面是c语言的

    #include<stdio.h>
    #include<stdlib.h>
    struct node
    {
        int key;
        node *lc;
        node *rc;
    };
    void Insert(int x,node *&p)
    {
        if(p==NULL)
        {
            p=new node;
            p->key=x;
            p->lc=NULL;
            p->rc=NULL;
        }
        else if(p->key>x)
            Insert(x,p->lc);
        else if(p->key<x)
            Insert(x,p->rc);
        else if(p->key==x)return ;
    }
    node* create(int n,node *&F)
    {
        int a;
        F=NULL;
        while(n--)
        {
            scanf("%d",&a);
            Insert(a,F);
        }
        return F;
    }
    void pre_order(node * p)
    {
        if(p!=NULL)
        {
            printf("%d ",p->key);
            pre_order(p->lc);
            pre_order(p->rc);
        }
    }
    void in_order(node * p)
    {
        if(p!=NULL)
        {
            in_order(p->lc);
            printf("%d ",p->key);
            in_order(p->rc);
        }
    }
    void post_order(node * p)
    {
        if(p!=NULL)
        {
            post_order(p->lc);
            post_order(p->rc);
            printf("%d ",p->key);
        }
    }
    void Free(node * p)
    {
        if(p!=NULL)
        {
            Free(p->lc);
            Free(p->rc);
            free(p);
        }
    }
    int main()
    {
        int n;
        while(scanf("%d",&n)!=EOF)
        {
            node *R;
            create(n,R);
            pre_order(R);
            printf("
    ");
            in_order(R);
            printf("
    ");
            post_order(R);
            printf("
    ");
            Free(R);
        }
        return 0;
    }

    很奇怪的一点,在dev c++上c编译通过,但是OJ上却是编译错误。

    考虑到c++兼容c,所以讲上述代码用c++编译,AC。

    好吧,不明觉厉。

    下面是自己写的c代码,除了引用,其他都是c

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 typedef struct BTNode
     4 {
     5     int data;
     6     struct BTNode *lchild;
     7     struct BTNode *rchild;
     8     
     9 }BTNode;
    10 void preorder(BTNode *p) 
    11 {
    12     if(p!=NULL)
    13     {
    14         printf("%d ",p->data);
    15         
    16         preorder(p->lchild);
    17         preorder(p->rchild);
    18     }
    19 }
    20 void inorder(BTNode *p) 
    21 {
    22     if(p!=NULL)
    23     {
    24         preorder(p->lchild);
    25         printf("%d ",p->data);
    26         preorder(p->rchild);
    27     }
    28 }
    29 void postorder(BTNode *p) 
    30 {
    31     if(p!=NULL)
    32     {
    33         preorder(p->lchild);
    34         preorder(p->rchild);
    35         printf("%d ",p->data);
    36     }
    37 }
    38 
    39 void myinsert(int num,BTNode *&p)
    40 {    
    41     printf("num==%d,p==%p
    ",num,p);
    42     if(p==NULL)
    43     {
    44         p=new BTNode;
    45         p->data=num;
    46         p->lchild=NULL;
    47         p->rchild=NULL;    
    48     }
    49     else if((p->data)<num)
    50         myinsert(num,p->rchild);
    51     else if((p->data)>num)
    52         myinsert(num,p->lchild);
    53 }
    54 void create(BTNode *&p,int n)
    55 {
    56     p=NULL;
    57     int num;
    58     while(n--)
    59     {
    60         scanf("%d",&num);
    61         myinsert(num,p);
    62     
    63         
    64     }
    65     
    66 }
    67 void myfree(BTNode *p)
    68 {
    69     if(p!=NULL)
    70     {
    71         myfree(p->lchild);
    72         myfree(p->rchild);
    73         free(p);
    74     }
    75 }
    76 
    77 int main(void)
    78 {
    79     int n,n2;
    80     int i;
    81     scanf("%d",&n2);
    82     for(i=0;i<n;i++)
    83     {
    84         scanf("%d",&n);
    85         BTNode *head;
    86         create(head,n);
    87         preorder(head);
    88         printf("
    ");
    89         inorder(head);
    90         printf("
    ");
    91         postorder(head);
    92         printf("
    ");
    93         myfree(head);
    94     }
    95     
    96     return 0;
    97 }

    代码略有不同,会打印出每次递归p所指向的地址以及赋值的元素,方便理解:递归每次完成后指针p都返回根结点。另外多组测试案例这个功能随手用n2次代替了,懒得改了

  • 相关阅读:
    Node自动重启工具 nodemon
    centos 集群
    kettle操作数据库增删改
    Dinic
    vim
    mermaid简介
    联赛模拟测试32
    检讨书模板
    博客园如何添加看板娘!
    手机浏览器如何调试
  • 原文地址:https://www.cnblogs.com/sairre/p/3954655.html
Copyright © 2011-2022 走看看