zoukankan      html  css  js  c++  java
  • 二叉排序树

    二叉排序树

    Time Limit: 1000MS Memory limit: 65536K

    题目描述

    二叉排序树的定义是:或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。 今天我们要判断两序列是否为同一二叉排序树

    输入

    开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
    接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉排序树。
    接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉排序树。(数据保证不会有空树)

    输出

     

    示例输入

    2
    123456789
    987654321
    432156789
    0

    示例输出

    NO
    NO
     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<stdlib.h>
     4 typedef struct tnode   /*建立节点*/
     5 {
     6     int data;
     7     struct tnode *l,*r;
     8 } tnode;
     9 tnode *q;                           /*构造指针变量*/
    10 tnode *bt;
    11 int temp;
    12 char one[12],two[12];
    13 void insert(tnode **b,tnode  *s)/*排序二叉树中插入节点*/
    14 {
    15     if((*b)==NULL)(*b)=s;
    16     else if(s->data==(*b)->data) return;
    17     else if(s->data<(*b)->data) insert((&(*b)->l),s);
    18     else if(s->data>(*b)->data)  insert((&(*b)->r),s);
    19 }
    20 void creat(tnode *b)               /*建立排序二叉树*/
    21 {
    22     int i,len;
    23     char str[12];
    24     scanf("%s",str);
    25     len=strlen(str);
    26     tnode *s;
    27     bt=NULL;                          /*初始化二叉数*/
    28     s=(tnode *)malloc(sizeof(tnode));
    29     q=s;                   /*将根结点指针地址赋值给q*/
    30     for(i=0; i<len; i++)      /*反复读入节点,直至-1结束*/
    31     {
    32         s->data=str[i];
    33         s->l=NULL;
    34         s->r=NULL;
    35         insert(&bt,s);/*节点插入排序二叉树中*/
    36         s=(tnode *)malloc(sizeof(tnode));
    37     }
    38 }
    39 void preorder(tnode *p)          /*先序遍历二叉树*/
    40 {
    41     if(p)
    42     {
    43         two[temp++]=p->data;
    44         preorder(p->l);
    45         preorder(p->r);
    46     }
    47 }
    48 void destroy(tnode *T)//销毁二叉树
    49 {
    50     if(T)
    51     {
    52         if(T->l)
    53             destroy(T->l);
    54         if(T->r)
    55             destroy(T->r);
    56         free(T);
    57         T=NULL;
    58     }
    59 }
    60 int main()                              /*主函数*/
    61 {
    62     int n;
    63     while(scanf("%d%*c",&n)&&n)
    64     {
    65         temp=0;
    66         creat(bt);                      /*构造排序二叉树*/
    67         preorder(q);                /*先序遍历排序二叉树*/
    68         destroy(q);
    69         two[temp]='';
    70         strcpy(one,two);
    71         while(n--)
    72         {
    73             temp=0;
    74             creat(bt);                      /*构造排序二叉树*/
    75             preorder(q);                /*先序遍历排序二叉树*/
    76             destroy(q);
    77             two[temp]='';
    78             if(strcmp(two,one))
    79                 printf("NO
    ");
    80             else
    81                 printf("YES
    ");
    82         }
    83     }
    84     return 0;
    85 }
    View Code

    不多说了,这题真心纠结,自己也是看着写的…………Orz

  • 相关阅读:
    Thinking in Java Reading Note(9.接口)
    Thinking in java Reading Note(8.多态)
    Thinking in Java Reading Note(7.复用类)
    SQL必知必会
    Thinking in Java Reading Note(5.初始化与清理)
    Thinking in Java Reading Note(2.一切都是对象)
    鸟哥的Linux私房菜笔记(1.基础)
    Thinking in Java Reading Note(1.对象导论)
    CoreJava2 Reading Note(2:I/O)
    CoreJava2 Reading Note(1:Stream)
  • 原文地址:https://www.cnblogs.com/kongkaikai/p/3226435.html
Copyright © 2011-2022 走看看