5-4 是否同一棵二叉搜索树 (25分)

来源:互联网 发布:肇庆金蝶软件 编辑:程序博客网 时间:2024/06/11 11:06
5-4 是否同一棵二叉搜索树   (25分)

给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。

输入格式:

输入包含若干组测试数据。每组数据的第1行给出两个正整数N (10)和L,分别是每个序列插入元素的个数和需要检查的序列个数。第2行给出N个以空格分隔的正整数,作为初始插入序列。最后L行,每行给出N个插入的元素,属于L个需要检查的序列。

简单起见,我们保证每个插入序列都是1到N的一个排列。当读到N为0时,标志输入结束,这组数据不要处理。

输出格式:

对每一组需要检查的序列,如果其生成的二叉搜索树跟对应的初始序列生成的一样,输出“Yes”,否则输出“No”。

输入样例:

4 23 1 4 23 4 1 23 2 4 12 12 11 20

输出样例:

YesNoNo

这里大概思考了一下,将树的每个节点进行比较进行确认。但是没有想到递归,记住这种每个过程都重复的操作一定要想到递归的方法

#include "stdafx.h"#include "stdlib.h"#include "iostream"typedef int ElementType;typedef struct TreeNode *PNode;typedef struct TreeNode{ElementType Data;PNode left;PNode right;TreeNode(int _date=-1)//新学的一种初始化方式,基本上等于类的构造函数{Data=_date;left=NULL;right=NULL;}};PNode Insert(ElementType x,PNode T){if(T==NULL)      {          T=new TreeNode(x);  //类似于调用构造函数        if(T==NULL)              printf("error\n");  /*        else{                 //使用new这种方法这步就可以省了        T->Data=x;          T->left=T->right=NULL;          } */     }      else if(x>T->Data)          T->right=Insert (x,T->right);      else if(x<T->Data)          T->left=Insert(x,T->left);      return T;  }bool SameOrNot(PNode T1,PNode T2){if(T1==NULL&&T2==NULL)return true;else if(T1==NULL&&T2!=NULL)return false;else if(T1!=NULL&&T2==NULL)return false;else if(T2->Data!=T1->Data)return false;else{bool flag1=SameOrNot(T1->left,T2->left);if(flag1){bool flag2=SameOrNot(T1->right,T2->right);if(flag2)return true;}return false;}}int main(){int n,m;    while(scanf("%d",&n) >0)      {          scanf("%d",&m);          int i , tmpn ;          PNode root = NULL ;          for(i = 0 ; i < n ; i++)          {              scanf("%d",&tmpn);              root = Insert(tmpn,root);          }          while(m --)          {              PNode root2 = NULL ;              for(i = 0 ; i < n ; i++)              {                  scanf("%d",&tmpn);                  root2 = Insert(tmpn,root2);              }              if(SameOrNot(root , root2))                  printf("Yes\n");              else                  printf("No\n");          }      }      return 0 ;  }



原创粉丝点击