Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2856996
  • 博文数量: 471
  • 博客积分: 7081
  • 博客等级: 少将
  • 技术积分: 5369
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-04 21:55
文章分类

全部博文(471)

文章存档

2014年(90)

2013年(69)

2012年(312)

分类: C/C++

2012-04-27 22:10:27

二叉排序树是一种动态树表。 二叉排序树的定义:二叉排序树或者是一棵空树, 或者是一棵具有
如下性质的二叉树: ⑴ 若它的左子树非空,则左子树上所有结点的值均小于根结点的值; ⑵ 若
它的右子树非空,则右子树上所有结点的值均大于根结点的值; ⑶ 左、右子树本身又各是一棵二
叉排序树。二叉排序树的性质: 按中序遍历二叉排序树,所得到的中序遍历序列是一个递增有序
序列。
相同n个结点的二叉排序树是不唯一的,形态和深度可能不同。
 
判断两序列是否为同一二叉搜索树序列
Input
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
 

Output
如果序列相同则输出YES,否则输出NO

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>

  4. typedef struct node
  5. {
  6.     int data;
  7.     struct node *left,*right;
  8. }*BiTree,BTNode;

  9. void insert(BiTree &t,BiTree s)//&t 这个地址一定要加,否则不能改变树的结构,个t可以像平时这样用t
  10. {
  11.     /*
  12.     a指向address1;
  13.     t亦都指向address1, 但后面t已经变左,如果不用&,则a不能随着t的变而变
  14.     */
  15.     if(s==NULL)
  16.         return;
  17.     BiTree p,temp;
  18.     if(t==NULL)
  19.     {
  20.         t=s;//t用来指向头结点的,下面没有用到,提供访问
  21.     }
  22.     else
  23.     {
  24.         p=t;
  25.         while(p!=NULL)
  26.         {
  27.             temp=p;
  28.             if(s->data < p->data)//遍历左子树
  29.             {
  30.                 p=p->left;
  31.             }
  32.             else//往右,题目已经说明是没有重复的数字
  33.             {
  34.                 p=p->right;
  35.             }
  36.         }

  37.         if(s->data < temp->data)//插入到左子树,temp指向父结点,把s插入进来
  38.         {
  39.             temp->left=s;
  40.         }
  41.         else
  42.         {
  43.             temp->right=s;
  44.         }

  45.     }

  46. }

  47. int check(BiTree s, BiTree t)//比较两树是否相同;0表示相同,1表示不同
  48. {
  49.     if(s==NULL && t==NULL)
  50.     {
  51.         return 0;
  52.     }
  53.     else if((s==NULL && t!=NULL) || (s!=NULL && t==NULL))
  54.     {
  55.         return 1;
  56.     }
  57.     else
  58.     {
  59.         if(s->data != t->data)
  60.         {
  61.             return 1;
  62.         }
  63.         else
  64.         {
  65.             return check(s->left,t->left)+check(s->right,t->right);
  66.         }

  67.     }
  68. }

  69. int main()
  70. {
  71.     int n,len1,len2,i,result;
  72.     char s[11],q[11];
  73.     while(scanf("%d",&n)!=EOF)
  74.     {
  75.            if(n==0)break;

  76.            scanf("%s",s);
  77.            len1=strlen(s);
  78.            BiTree t;
  79.            t=NULL;
  80.            for(i=0;i<len1;i++)//建立示范序列的二叉树;
  81.            {
  82.                  BiTree p;
  83.                  p=(BiTree)malloc(sizeof(BTNode));
  84.                  p->data=s[i]-'0';
  85.                  p->left=NULL;
  86.                  p->right=NULL;
  87.                  insert(t,p);
  88.            }
  89.            while(n--)
  90.          {
  91.                  scanf("%s",q);
  92.                  len2=strlen(q);
  93.                  BiTree r;
  94.                  r=NULL;
  95.                  for(i=0;i<len1;i++)//建立示范序列的二叉树;
  96.                  {
  97.                      BiTree p;
  98.                      p=(BiTree)malloc(sizeof(BTNode));
  99.                      p->data=q[i]-'0';
  100.                      p->left=NULL;
  101.                      p->right=NULL;
  102.                      insert(r,p);
  103.                  }
  104.                  result=check(r,t);
  105.                  if(result==0){
  106.                       printf("YES\n");
  107.                  }
  108.                  else{
  109.                       printf("NO\n");
  110.                  }
  111.            }
  112.                             
  113.     }
  114.     return 0;
  115. }

阅读(1218) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

nba76ers2012-04-28 09:50:20

相同的数列,但是输入顺序不一样,也可以构造相同形态的二叉排序树,本题目就是要解决这种问题,是不是相同形态的输入