九度oj 题目1009:二叉搜索树 【ZJU2010考研机试题5】【二叉排序树】

题目1009:二叉搜索树

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:3168

解决:1411

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

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

样例输入:
2
567432
543267
576342
0
样例输出:
YES
NO
来源:
2010年浙江大学计算机及软件工程研究生机试真题
答疑:
解题遇到问题?分享解题心得?讨论本题请访问: http://t.jobdu.com/thread-7733-1-1.html

法1、树的数组存储法(可遍历)

 
/**************************************************************
    Problem: 1009
    Language: C++
    Result: Accepted
    Time:10 ms
    Memory:1136 kb
****************************************************************/
#include <stdio.h>
#include<string.h>
const int MAX=10000;
int ans1[MAX],ans2[MAX],t[MAX];
void createTree(char a[]) //用数组存储一个二叉树
{
    int i,j,tmp;
    for(i=0;i<MAX;i++)  //初始化
        t[i]=-1;
    for(i=0;a[i]!=0;i++){ //把每个字符插入到数组中相应位置
        j=1; tmp=a[i]-'0';
        while(t[j]!=-1){
            if(tmp<=t[j])
                j=2*j;
            else
                j=2*j+1;
        }
        t[j]=tmp;
    }
}
/*
void preOrder(int t[],int x){
    if(x<MAX){
        if(t[x]!=-1)
            printf("%d",t[x]);
        preOrder(2*x);
        preOrder(2*x+1);
    }
}
void inOrder(int t[],int x){
    if(x<MAX){
        inOrder(2*x);
        if(t[x]!=-1)
            printf("%d",t[x]);
        inOrder(2*x+1);
    }
}
*/
int main()
{
    int i,j,k,n;
    char s[15];
    //freopen("G:\\in.txt", "r", stdin);
    while(scanf("%d",&n)!=EOF){
        if(n==0) break;
        scanf("%s",s);
        createTree(s);
        for(i=0;i<MAX;i++)
            ans1[i]=t[i];
        for(i=0;i<n;i++){
            scanf("%s",s);
            createTree(s);
            for(j=0;j<MAX;j++)  //外层用i,里面用j吧~~~
                ans2[j]=t[j];
            for(k=0;k<MAX;k++){
                if(ans1[k]!=ans2[k])
                    break;
            }
            if(k==MAX) printf("YES\n");
            else printf("NO\n");
        }   
    }   
    return 0;
}

法2、树的二叉存储法


/*
	
*/
#include <stdio.h>
#include<string.h>
int n,cnt,size;
char tmpAns[30];
struct Node{
	char num;
	Node* lchild;
	Node* rchild;
}Tree[20000];
Node* create()//申请某个静态数组单元 以供 接下来插入数据。
{
	Tree[cnt].lchild=Tree[cnt].rchild=NULL;
	Tree[cnt].num=0;
	return &Tree[cnt++];  //返回当前申请的地址单元Tree[cnt],然后cnt自动加1.
}
Node* insert(Node* T,char x)  //把某个元素插入树中。
{
	if(T==NULL){
		T=create();
		T->num=x;
		return T;
	}
	else if(x<T->num)
		T->lchild=insert(T->lchild,x);
	else if(x>T->num)
		T->rchild=insert(T->rchild,x);
	return T;
}
void preOrder(Node* T){
	if(T==NULL)
		return;
	tmpAns[size++]=T->num;
	if(T->lchild!=NULL)
		preOrder(T->lchild);
	if(T->rchild!=NULL)
		preOrder(T->rchild);
}
void inOrder(Node* T){
	if(T==NULL)
		return;
	if(T->lchild!=NULL)
		inOrder(T->lchild);
	tmpAns[size++]=T->num;
	if(T->rchild!=NULL)
		inOrder(T->rchild);
}
int main()
{
	int i,j;
	char s[15],str[30],tmp[30];
   // freopen("G:\\in.txt", "r", stdin);
    while(scanf("%d",&n)!=EOF){
		if(n==0) break;
		for(i=0;i<30;i++)  //初始化字符串
			str[i]=tmpAns[i]=0;
		cnt=size=0;
		getchar();
		gets(s);
		Node* T=NULL; //创建一棵树根为空。
		cnt=size=0; //cnt=0表示从第0个结点开始申请起。
		for(i=0;s[i]!=0;i++)
			T=insert(T,s[i]);
		//处理s--构造一颗二叉排序树。把前序+中序遍历结果存到一个字符数组str[]里.
		preOrder(T);
		inOrder(T);
		strcpy(str,tmpAns);
		for(j=0;j<n;j++){ //-----------------内层循环用了i,外层就不要再用!!!!!!!!
			gets(s);
			Node* T1=NULL;
			for(i=0;i<30;i++)  //初始化字符串
				tmp[i]=tmpAns[i]=0;
			cnt=size=0;  //cnt-记录申请的单元数,size-记录
			//处理-------------------------------------------------tmp[]-----
			for(i=0;s[i]!=0;i++)
				T1=insert(T1,s[i]);
			preOrder(T1);
			inOrder(T1);
			strcpy(tmp,tmpAns);
			if(strcmp(str,tmp)==0)
				printf("YES\n");
			else
				printf("NO\n");
		}
	}	
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,根据提供的引用内容,我无法回答关于西北工业大学计算考研真题在百度云上的问题。引用提供了一个关于字符串合并的样例输入和输出,而引用和引用提供了一些与西北工业大学计算研究生的相关信息。但是,这些引用内容都没有提供与百度云相关的信息。如果您有关于其他方面的问题,我将很乐意为您提供帮助和回答。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [九度OJ 题目1471:合并符串](https://blog.csdn.net/SJF0115/article/details/8609716)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [2021西北工业大学考研历年真题](https://blog.csdn.net/weixin_42502288/article/details/118177726)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [undefined](undefined)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值