比较二棵二叉排序树是否相等
来源:互联网 发布:me452ch a是什么网络 编辑:程序博客网 时间:2024/05/29 05:10
问题描述:
对输入的两个序列生成二叉排序树,判断他们是否是相同的二叉排序树。
输入:
2 要比较的次数 1-20之间
567432 主比较字符串,下面的2个字符串都和它进行比较 长度小于10
543267
576342
输出: YES
NO
问题分析:
要比较两棵二叉排序树是否相等,需要判断包含中序遍历的两种遍历方式是否相同才可以。
算法:
1.对输入的主比较序列生成二叉排序树T1;
2.对T1进行前、中遍历,结果存放在字符数组st1中
3.对每一个需要比较的字符串和1,2进行相同的操作生成字符数组st2.
4.比较str1,str2是否相同得出结果。
代码实现:
#include <iostream>
#include<stdio.h>
#include<string.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
char str1[22]; //存放前序和后序的遍历结果
char str2[22]; //存放前序和后序的遍历结果
int size1, size2;
//二叉树结构
struct Node {
Node * lchild;
Node * rchild;
int c;
}Tree[220];
int loc = 0;
Node* create() {
Node *T = &Tree[loc];
T->lchild = T->rchild = NULL;
loc++;
return T;
}
//插入函数(x插入二叉排序树T中)
Node* Insert(Node *T, int x) {
if (T == NULL) {
T = create();
T->c = x;
}
else if (x<T->c) {
T->lchild = Insert(T->lchild, x);
}
else {
T->rchild = Insert(T->rchild, x);
}
return T;
}
//前序遍历
void preOrder(Node *T, char *str,int &size) {
//访问根
//strcat(str,T->c+'0');
//str[strlen(str) - 1] = T->c + '0';
str[size++] = T->c+'0';
if (T->lchild != NULL) {
preOrder(T->lchild, str,size);
}
if (T->rchild != NULL) {
preOrder(T->rchild, str,size);
}
}
void midOrder(Node *T, char *str,int &size) {
if (T->lchild != NULL) {
midOrder(T->lchild, str,size);
}
//访问根
//str[strlen(str) - 1] = T->c + '0';
str[size++] = T->c+'0';
if (T->rchild != NULL) {
midOrder(T->rchild, str,size);
}
}
int n;
char str[11];
int main(int argc, char *argv[]) {
//1.生成主比较字符串的前、中遍历结果
cout << "输入比较次数:" << endl;
cin >> n;
cout << endl;
Node *T = NULL;
cout << "输入主比较字符串:" << endl;
cin >> str;
cout << endl;
for (int i = 0; i<strlen(str); i++) {
T = Insert(T, str[i] - '0');
}
size1 = 0;
preOrder(T, str1,size1);
midOrder(T, str1,size1);
//cout << str1<<endl;
//2. 输入n个比较字符串
while (n--) {
//2.1 生成二叉排序树
Node *tmp=NULL;
char str_tmp[11];
cout << "输入次比较字符串" << endl;
cin >> str_tmp;
for (int i = 0; i<strlen(str_tmp); i++) {
tmp = Insert(tmp, str_tmp[i] - '0');
}
//2.2生成前、中遍历结果
size2 = 0;
preOrder(tmp, str2,size2);
midOrder(tmp, str2,size2);
//3.比较主比较字符串的前、中序列和比较字符串的前、中序列是否相同。
printf("主比较字符串遍历结果:%s , 次比较字符串遍历结果:%s", str1, str2);
if (strcmp(str1, str2) != 0) {
cout <<endl<< "比较结果:NO" << endl;
}
else
{
cout << endl<< "比较结果:YES" << endl;
}
cout << endl;
}
getchar(); getchar(); getchar();
return 0;
}
代码分析:
在对字符数组进行添加时候采用手动设置一个计数器。
- 比较二棵二叉排序树是否相等
- 比较二个对象值是否相等
- 比较字符串是否相等
- 比较字符串是否相等
- list比较是否相等
- 比较字符串是否相等
- 比较二个对象的每个值是否相等
- 判断两颗二叉排序树是否相等
- 比较BigDecimal对象是否相等
- 比较两个字符串是否相等?
- 比较两个数字是否相等
- 比较两个对象是否相等
- 比较两个字符串是否相等
- 比较两个UIImage是否相等
- 比较两个vector是否相等
- 比较两个字符串是否相等
- 比较两个字符串是否相等
- 比较两个数据是否相等
- 【种类并查集】 poj1182食物链
- Jmeter之响应断言
- 数据标准化:数据资产化从0到1的起点
- 文件编码格式ANSI转UTF8
- RecyclerView简单使用总结
- 比较二棵二叉排序树是否相等
- JDK1.6在SUSE11下问题跳变定时任务失效问题记录
- 51nod 1056 最长等差数列 V2
- Oracle-分析函数之sum(...) over(...)
- poj 3484 Showstopper(二分)
- iOS自定义摄像机或者拍照
- Couldn't run /usr/bin/dumpcap in child process:权限不够
- python中的os.path.join() 作用
- Anbox让你在Linux上“原生运行”Android应用