补SDUT-2482
来源:互联网 发布:炫踪网络上市 编辑:程序博客网 时间:2024/05/22 13:11
今天和贺老师讨论了一下这个题,有了新的收获;昨天发的代码不是正解,正解应该是先对给出两个序列进行建树,然后保存树的先序遍历结果,对比这两个先序遍历的结果是否一样;如果一样就是同一棵二叉树,否则不是。
先概括一下这两个解法:第一个解法是对两个要比较的序列分别建树,然后保存下来两个树的先序遍历序列,并比较这两个先序遍历序列是否相等;若相等则是同一棵树,否则不是!第二种解法是只对第一个序列建树并对建好的树进行先序遍历,保存先序遍历的结果;将先序遍历的结果直接与第二个输入的序列比较,若相等则是同一棵树,否则不是!
第二种解法是错误的,SDUTOJ的评测数据不完整!
补一些知识:二叉排序树的中序序列是递增的!而这道题目又说了序列数字都在零到九之间!也就是说如果两棵树的前序遍历序列相等的话,中序遍历序列必定相等!这是隐含的条件。我真的是太渣了!
代码:
#include<bits/stdc++.h>using namespace std;typedef struct node{ char data; struct node *lchild; struct node *rchild;}bstnode;char sr[55],sq[55],sr2[55],sq2[55];int sq0,sq1;void jianshu(bstnode *&p,char ch){ if(p==NULL) { p=(bstnode *)malloc(sizeof(bstnode)); p->data=ch; p->lchild=p->rchild=NULL; } else if(ch<p->data) jianshu(p->lchild,ch); else jianshu(p->rchild,ch);}void pre0(bstnode *p){ if(p) { sq[sq0++]=p->data; pre0(p->lchild); pre0(p->rchild); }}void pre1(bstnode *p){ if(p) { sq2[sq1++]=p->data; pre1(p->lchild); pre1(p->rchild); }}int main(){ int i,m; while(cin>>m&&m!=0) { bstnode *tree=NULL; cin>>sr; int len1=strlen(sr); for(i=0;i<len1;i++) jianshu(tree,sr[i]); sq0=0; pre0(tree); sq[sq0]='\0';///这个不加会错 while(m--) { bstnode *tree1=NULL; cin>>sr2; int len2=strlen(sr2); for(i=0;i<len2;i++) jianshu(tree1,sr2[i]); sq1=0; pre1(tree1); sq2[sq1]='\0'; if(strcmp(sq,sq2)==0) cout<<"YES"<<endl; else cout<<"NO"<<endl; } } return 0;}
不断修正自己的错误是很重要的;不要一味的写题写题,我需要脚踏实地!
阅读全文
0 0
- 补SDUT-2482
- sdut acm 考新郎(补题)
- SDUT-2482
- SDUT 2482 二叉排序树
- SDUT 2482 二叉排序树
- SDUT 2482 二叉排序树
- SDUT 2482 二叉排序树
- SDUT 2482 二叉排序树
- SDUT 2482 二叉排序树
- 二叉排序树 (sdut oj 2482)
- <sdut-ACM> 2482二叉排序树
- sdut acm(补题)小P的故事——神奇的发票报销
- 补
- 补
- 补
- SDUT-2109&&SDUT-3398
- sdut 1248
- sdut 1468
- 从《王者荣耀》来聊聊游戏的帧同步
- time.After 在select-case中使用的正确姿势
- Scala 与Java 简单交互方式2
- List概述
- 一些Linux常用命令(学习笔记)
- 补SDUT-2482
- Unity3D绘制多条直线
- 批量删除redis特殊键值
- spring mvc 接收多个model
- kafka学习笔记(1)
- SQL Server on Ubuntu——Ubuntu上的SQL Server(全截图)
- php 读取二进制文件---笔记
- 一步一步学习ROP x86Linux
- 直接在myeclipse里写代码新建一个数据库