杭电 二叉搜索树

xiaoxiao2021-02-28  97

思路:先说一下二叉搜索树吧 ,大的数字全都在右子树小的数全都在左子树,建立的时候以第一个树为核心比较 比他大则往右子树走然后在右边也按照相同的方法一直到树为NULL,左边也是一样。 这个题先根据第一个字符串建立一颗二叉搜索树。然后前序保存在一个数组。接着输入第二个字符串也前序保存另外一个数组,然后拿这两个字符串比较如果相同则yes不同则no

二叉搜索树

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 1   Accepted Submission(s) : 1

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

判断两序列是否为同一二叉搜索树序列

Input

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

Output

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

Sample Input

2 567432 543267 576342 0

Sample Output

YES NO #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct Tree { char data; struct Tree *lchild; struct Tree *rchild; }Tree,*BiTree; int count; int erchasousuo(char a,BiTree root,BiTree f,BiTree &p)\\f表示父亲节点。p用来传递父亲节点 { if(root==NULL) { p=f; return 0;} if(a>root->data) {return erchasousuo(a,root->rchild,root,p); } else if(a<root->data){return erchasousuo(a,root->lchild,root,p); } else return 1; } void qianxu(Tree *root,char *a) { if(root==NULL) return; a[count++]=root->data; qianxu(root->lchild,a); qianxu(root->rchild,a); } BiTree fun(char *a)//建立二叉搜索树 { BiTree root=NULL; for(int i=0;a[i];i++)//从第一个数字开始到\0; { BiTree p=NULL; erchasousuo(a[i],root,NULL,p); BiTree q=(Tree*)malloc(sizeof(Tree)); q->data=a[i]; q->lchild=NULL; q->rchild=NULL; if(p==NULL) {//当p等于空则表示是第一个数字。不需要比较 root=q; } else { if(q->data>p->data) p->rchild=q;//比较看是比父亲节点的数据大还是小。大则放在右边,小就放在左边。 else p->lchild=q; } } return root; } int main() { char a[11],b[11],c[11]={0}; int n; while(scanf("%d",&n)==1) {if(n==0) break; scanf("%s",a); BiTree root=fun(a); count=0; memset(c,0,sizeof(c)); qianxu(root,c); while(n--) { scanf("%s",b); BiTree root=fun(b); memset(b,0,sizeof(b)); count=0; qianxu(root,b); if(strcmp(b,c)==0)printf("YES\n"); else printf("NO\n"); }} }

转载请注明原文地址: https://www.6miu.com/read-64219.html

最新回复(0)