九度1009判断两个序列构成的两个二叉排序树是否相同

来源:互联网 发布:linux安装anaconda 编辑:程序博客网 时间:2024/05/17 08:35

    此程序中,实现用递归构造二叉排序树,以前递归一直构造不成功,仔细看看书,发现是函数传送参数的时候,不能传送指向结点的指针,若这样只能改变此指针指向内容,而无法改变此指针,但是递归构造时,当函数接受的参数为NULL时,要分配空间,把这个新空间的指针值赋给传过来的指针,所以传送参数时要传指针的指针,这样就不仅可以改变指针指向的能容,也能改变这个指针,这样就顺利生成新的结点。

 

本题思路:分别根据序列构造排序树,对比这两棵树的前序序列和中序序列,若都相同则这两颗二叉树相同

#include<stdio.h>#include<string.h>typedef struct NODE{  char data;  struct NODE *lc,*rc;}node;typedef node * nodeptr;int pos;void insertNode(nodeptr *treeptr,char value){  if((*treeptr)==NULL)  {    (*treeptr)=malloc(sizeof(node));    (*treeptr)->data=value;    (*treeptr)->lc=NULL;    (*treeptr)->rc=NULL;  }else if(value<(*treeptr)->data)       insertNode(&((*treeptr)->lc),value);   else if(value>(*treeptr)->data)     insertNode(&((*treeptr)->rc),value);}         void createBT(node **root,int num,char x[]){  int i;    for(i=0;i<num;i++)    insertNode(root,x[i]);}void preOrder(node *T,char x[]){  if(T!=NULL)  {    x[pos++]=T->data;    preOrder(T->lc,x);    preOrder(T->rc,x);  }}      void inOrder(node *T,char x[]){  if(T!=NULL)  {    inOrder(T->lc,x);    x[pos++]=T->data;    inOrder(T->rc,x);  }}          int main(){  int n,i,j,len;  node *BT,*BX;  char s[10],temp[10],pre[10],in[10];  scanf("%d",&n);  while(n)  {    BT=NULL;    scanf("%s",s);    len=strlen(s);    createBT(&BT,len,s);    pos=0;    preOrder(BT,pre);    pos=0;    inOrder(BT,in);        for(i=0;i<n;i++)    {      BX=NULL;        scanf("%s",s);      len=strlen(s);      createBT(&BX,len,s);      pos=0;      preOrder(BX,temp);      for(j=0;j<len;j++)        if(pre[j]!=temp[j]) break;      if(j<len) printf("NO\n");      else      {        pos=0;        inOrder(BX,temp);               for(j=0;j<len;j++)           if(in[j]!=temp[j]) break;        if(j<len) printf("NO\n");        else printf("YES\n");      }    }    scanf("%d",&n);  } return 0;}