九度题目1201:二叉排序树

题目1201:二叉排序树
时间限制:1 秒内存限制:32 兆特殊判题:否提交:3008解决:1262
题目描述:
    输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历。
输入:
    输入第一行包括一个整数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年华中科技大学计算机保研机试真题

AC代码:
ps:这一回算是正儿八经学一回指针了。。。。

#include<stdio.h>
#include<string.h>
struct node
{
   int data;
   struct node *Ltree;
   struct node *Rtree;
};
//Node *head;就是Node*head=0;head沒指向任何對象.
//Node *head=new Node;head指向一個Node型的對象.
node *head=new node(); //申请二叉树的指针且分配了结构体空间
//前序遍历
void PreOrder(node *head)
{
        if(head)
        {
                printf("%d ",head->data);
                PreOrder(head->Ltree);
                PreOrder(head->Rtree);
        }
}
//中序遍历
void InOrder(node *head)
{
        if(head)
        {
                InOrder(head->Ltree);
                printf("%d ",head->data);;
                InOrder(head->Rtree);
        }
}

//后序遍历
void PostOrder(node *head)
{
        if(head)
        {
                PostOrder(head->Ltree);
                PostOrder(head->Rtree);
                printf("%d ",head->data);
        }
}
//撤销二叉树
void deleteTree(node *head)
{
        if(head)
        {
                deleteTree(head->Ltree);
                deleteTree(head->Rtree);
                delete head;
        }
}
//建立二叉排序树
void buildBinarySortTree(node *head,int elem[],int length)
{
     node *p,*pre;
     int flagLeftOrRight;
     int success;

     head->data=elem[0];
     head->Ltree=NULL;
     head->Rtree=NULL;

     for(int i=1;i<length;i++)
     {
        success=0;
        pre=NULL;
        p=head;
        while(p)//寻找插入的位置
        {
           pre=p;
           if(p->data==elem[i])//查找成功
           {
              success=1;
              break;
           }
           else if(p->data<elem[i])
           {
              p=p->Rtree;
              flagLeftOrRight=1;
           }
           else
           {
               p=p->Ltree;
               flagLeftOrRight=0;
           }
        }

        if(!success)
        {
           p=new node();//生成新节点
           p->data=elem[i];
           p->Ltree=NULL;
           p->Rtree=NULL;

           if(flagLeftOrRight==0)
           {
              pre->Ltree=p;
           }
           else if(flagLeftOrRight==1)
           {
              pre->Rtree=p;
           }
        }
     }
}
int main()
{
    int i,j,n,m;
    int elem[110];
    while(scanf("%d",&n)!=EOF)
    {
       for(i=0;i<n;i++)
       {
          scanf("%d",&elem[i]);
       }
       buildBinarySortTree(head,elem,n); 

       PreOrder(head);
       puts("");
       InOrder(head);
       puts("");
       PostOrder(head);
       puts("");
    }
    return 0;
}
时间: 2024-09-24 03:14:40

九度题目1201:二叉排序树的相关文章

九度题目1009:二叉搜索树

题目1009:二叉搜索树 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4308 解决:1919 题目描述: 判断两序列是否为同一二叉搜索树序列 输入: 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树. 接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树. 输出: 如果序列相同则输出YES

九度题目1120:全排列

题目1120:全排列  时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2749 解决:669 题目描述: 给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列. 我们假设对于小写字母有'a' < 'b' < ... < 'y' < 'z',而且给定的字符串中的字母已经按照从小到大的顺序排列. 输入: 输入只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间. 输出: 输出这个字符串的所有排列方式,每行一个排列.要求字母序比较小的排列在前

九度题目1110:小白鼠排队

题目1110:小白鼠排队 时间限制:1 秒内存限制:32 兆特殊判题:否提交:1348解决:820 题目描述: N只小白鼠(1 <= N <= 100),每只鼠头上戴着一顶有颜色的帽子.现在称出每只白鼠的重量,要求按照白鼠重量从大到小的顺序输出它们头上帽子的颜色.帽子的颜色用"red","blue"等字符串来表示.不同的小白鼠可以戴相同颜色的帽子.白鼠的重量用整数表示. 输入: 多案例输入,每个案例的输入第一行为一个整数N,表示小白鼠的数目. 下面有N行

九度题目1188:约瑟夫环

题目1188:约瑟夫环 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1500 解决:665 题目描述:     N个人围成一圈顺序编号,从1号开始按1.2.3......顺序报数,报p者退出圈外,其余的 人再从1.2.3开始报数,报p的人再退出圈外,以此类推.     请按退出顺序输出每个退出人的原序号. 输入: 包括一个整数N(1<=N<=3000)及一个整数p. 输出: 测试数据可能有多组,对于每一组数据, 按退出顺序输出每个退出人的原序号. 样例输入: 7 3 样例输出:

九度题目1008:最短路径问题

题目1008:最短路径问题 时间限制:1 秒内存限制:32 兆特殊判题:否提交:5129解决:1634 题目描述: 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花 费,如果最短距离有多条路线,则输出花费最少的. 输入: 输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p. 最后一行是两个数 s,t;起点s,终点t.n和m为0时输入结束. (1n=1000, 0m100000,

九度题目1363:欢乐斗地主

欢乐斗地主 时间限制:1 秒内存限制:32 兆特殊判题:否提交:727解决:163 题目描述:               如果大家玩过欢乐斗地主这个游戏,就一定知道有一个具有"提示"功能的按钮.如果你不知道你现在手 里的牌有没有比上家大的牌,并且你也懒得去一张一张地看你手中的牌.这时候你就可以点"提示"按钮,系 统会告诉你是否有这样的牌.          如果你是一个喜欢挑战的人,你就一定会想,能不能写一个程序,让它实现欢乐斗地主中的"提示"

九度题目1027:欧拉回路

题目1027:欧拉回路 时间限制:1 秒内存限制:32 兆特殊判题:否提交:2344解决:1157 题目描述:     欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路.现给定一个图,问是否存在欧拉回路? 输入:     测试输入包含若干测试用例.每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M:随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号).当N为0时输入结束. 输出:

九度题目1153:括号匹配问题

题目1153:括号匹配问题 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2965 解决:1315 题目描述:     在某个字符串(长度不超过100)中有左括号.右括号和大小写字母:规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右 边且距离最近的右括号匹配.写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号.不能匹配的 左括号用"$"标注,不能匹配的右括号用"?"标注. 输入:     输入包括多组数据,

九度题目1209:最小邮票数

题目1209:最小邮票数  时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1680 解决:558 题目描述:     有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值.     如,有1分,3分,3分,3分,4分五张邮票,要求凑成10分,则使用3张邮票:3分.3分.4分即可. 输入:     有多组数据,对于每组数据,首先是要求凑成的邮票总值M,M100.然后是一个数N,N〈20,表示有N张邮票.接下来是N个正整数,分别表 示这N张邮票的面值,且以升序排列. 输出: