04-树4 是否同一棵二叉搜索树(25 point(s))

来源:互联网 发布:网络音乐盛典歌曲 编辑:程序博客网 时间:2024/06/07 00:55

题目位置
分析:本来思考是否可以 通过不构成树,只通过 插入时 顺序,知道是否为,一颗查找树。 后来发现,这是不可以的,因为插入数据的不同,插入时的路径也不同,所以 没有相似之处。所以 选择 最笨的方法 实现这道题。
解决方法:构造查找树,实现插入方法。
【(通过层序遍历得顺序 知道是否为同一个查找树)赫然发现- - 这是不行的,除非对每一个地方进行判断。进行一次判断是不行的。】
故决定 进行中序遍历 和先序遍历,来唯一确定一棵树。

#include <stdio.h>#include <stdlib.h>typedef struct BinTree *Tree;struct BinTree{    char data;    Tree left;    Tree right;};void resultSeq(int N,char *preSeq,char *postSeq);Tree insert(Tree T,char data);void preorder(Tree T,int *i,char *preSeq1);int main(){    int N,L;    int i,j;    scanf("%d",&N);    int result[3000];    int index=0;    while(N){       scanf("%d",&L);       char preSeq1[N+2];       char postSeq1[N+2];       char preSeq2[N+2];       char postSeq2[N+2];        resultSeq(N,preSeq1,postSeq1);        for(i=0;i<L;i++)        {         resultSeq(N,preSeq2,postSeq2);         if(strcmp(preSeq1,preSeq2)==0&&strcmp(postSeq1,postSeq2)==0)            result[index] =1,index++;         else result[index] = 0,index++;        }        scanf("%d",&N);    }    for(i=0;i<index;i++)    {   if(i!=0)printf("\n");        if(result[i]==1)printf("Yes");        else printf("No");    }}void resultSeq(int N,char *preSeq,char *postSeq){       Tree T1=NULL;       int i=0,q=0;       int j=0;       char data[2];       for(j=0;j<N;j++){       scanf("%s",&data),T1 = insert(T1,data[0]);       }       i=0;       preorder(T1,&i,preSeq);       preSeq[i+1]='\0';       q=0;       postorder(T1,&q,postSeq);       postSeq[q]='\0';}void preorder(Tree T,int *i,char *preSeq1){    if(T)    {    preSeq1[*i] = T->data;    (*i)++;    preorder(T->left,i,preSeq1);    (*i)++;    preorder(T->right,i,preSeq1);    }    else {(*i)--;return;}}void postorder(Tree T,int *i,char *preSeq1){    if(T)    {    postorder(T->left,i,preSeq1);    postorder(T->right,i,preSeq1);    preSeq1[*i] = T->data;    (*i)++;    free(T);    }    else {return;}}Tree insert(Tree T,char data){    if(!T){            T = (Tree)malloc(sizeof(struct BinTree));            T->data =data;            T->left=NULL;            T->right=NULL;            return T;    }    else{        if(T->data<data) T->right = insert(T->right,data);        else if(T->data>data) T->left = insert(T->left,data);    }    return T;}