题目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("\n");
        in_order(R);
        printf("\n");
        post_order(R);
        printf("\n");
        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\n",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("\n");
89         inorder(head);
90         printf("\n");
91         postorder(head);
92         printf("\n");
93         myfree(head);
94     }
95     
96     return 0;
97 }

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

posted @ 2014-09-03 21:40  卡洛斯的拉幕人  阅读(154)  评论(0编辑  收藏  举报