题目描述
二叉树分别以数组存储方式创建、以先序遍历序列创建。输入二叉树的数组存储、先序遍历结果,判断根据它们创建的二叉树是否是同一棵二叉树。
输入
测试次数t
每组测试数据两行:
第一行:二叉树的数组存储(英文字母表示树结点,#表示空树)
第二行:二叉树的先序遍历结果(英文字母表示树结点,#表示空树)
输出
对每组测试数据,如果两种方式创建的是同一棵二叉树,输出YES,否则,输出NO。
样例输入
3 ABCDE ABD##E##C ABC##DE####W##F AB##CDW###E#F## abc##d ab##c#d
样例输出
YES YES NO
提示
#include<iostream> #include<string> using namespace std; class BitreeNode { public: char data; BitreeNode *left; BitreeNode *right; BitreeNode() { left=right=NULL; } }; class Bitree { public: int pos; BitreeNode *Root; string strtree; string strpre; string strin; Bitree(string str) { strpre=""; strin=""; pos=0; strtree=str; Root=CreateBitree(); } BitreeNode *CreateBitree() { char ch=strtree[pos]; pos++; if(ch==‘#‘) return NULL; else { BitreeNode *T=new BitreeNode(); T->data=ch; T->left=CreateBitree(); T->right=CreateBitree(); return T; } } void preorder(BitreeNode *T) { if(T!=NULL) { strpre+=T->data; preorder(T->left); preorder(T->right); } return; } void inorder(BitreeNode *T) { if(T!=NULL) { inorder(T->left); strin+=T->data; inorder(T->right); } return; } }; class Martree { public: char *Tree; int number; string strpre; string strin; Martree(string str) { strpre=""; strin=""; number=(int)str.size(); Tree=new char[number]; for(int i=0;i<number;i++) Tree[i]=str[i]; } void preorder(int i) { if(i<number) { if(Tree[i]!=‘#‘) { strpre+=Tree[i]; preorder(2*i+1); preorder(2*i+2); } } return; } void inorder(int i) { if(i<number) { if(Tree[i]!=‘#‘) { inorder(2*i+1); strin+=Tree[i]; inorder(2*i+2); } } return; } }; int main() { int T; cin>>T; while(T--) { string str1,str2; cin>>str1>>str2; if(str2[str2.size()-1]!=‘#‘) str2+="##"; Martree mTree(str1); Bitree bTree(str2); mTree.preorder(0); mTree.inorder(0); bTree.preorder(bTree.Root); bTree.inorder(bTree.Root); if(mTree.strpre==bTree.strpre&&mTree.strin==bTree.strin) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }
原文地址:https://www.cnblogs.com/SZU-DS-wys/p/12180863.html
时间: 2024-10-16 01:46:49