2020.11.11问题 B: DS二叉树--同一棵二叉树?

题目描述

二叉树分别以数组存储方式创建、以先序遍历序列创建。输入二叉树的数组存储、先序遍历结果,判断根据它们创建的二叉树是否是同一棵二叉树。

输入

 测试次数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>
#include<queue>
using namespace std;
class BiTreeNode {
public:
	char data;
	BiTreeNode* leftChild;
	BiTreeNode* RightChild;
	BiTreeNode() :leftChild(NULL), RightChild(NULL) {}
	~BiTreeNode() {}
};
class BiTree {
private:
	BiTreeNode* Root;
	int pos;
	string strTree, Tree;
	BiTreeNode* CreateBiTree();
	void Compare();//内部Compare函数 
public:
	BiTree() {};
	~BiTree() {};
	void CreateTree(string TreeArray);
	void Input(string _Tree);//数组存储二叉树输出 
};
void BiTree::CreateTree(string TreeArray) {//函数用于创建二叉树并于数组存储进行比较 
	pos = 0;
	strTree.assign(TreeArray);
	Root = CreateBiTree();
	Compare();
}
BiTreeNode* BiTree::CreateBiTree()
{
	BiTreeNode* T;
	char ch;
	ch = strTree[pos++];
	while(ch){
	if (ch == '#'){
		T = new BiTreeNode();
		T->data='#';
		T->leftChild=NULL;
		T->RightChild=NULL;
	}
	else
	{
		T = new BiTreeNode();
		T->data = ch;
		
		T->leftChild = CreateBiTree();
		T->RightChild = CreateBiTree();
	}
	return T;
}
}
void BiTree::Compare(){
	int i = 0;
	BiTreeNode* p;
	queue<BiTreeNode*> Q;
	Q.push(Root);
	while (i < Tree.length())
	{
		p = Q.front();
		Q.pop();
		if (p) {
			if (p->data != Tree[i])
			{
				cout << "NO" << endl;
				return;//不匹配则结束函数 
			}
			Q.push(p->leftChild);//左子树入队 
			Q.push(p->RightChild);//右子树入队 
		}i++;
	}
	cout << "YES" << endl;//循环完则说明匹配 
}

void BiTree::Input(string _Tree) {
	Tree = _Tree;
}
int main() {
	int t, i;
	cin >> t;
	for (i = 0; i < t; i++) {
		string s1, s2;
		cin >> s1 >> s2;
		BiTree* T = new BiTree();
		T->Input(s1); 
		T->CreateTree(s2);
	}
	return 0;
}

上一篇:王道C语言版二叉树的遍历及其深度代码总结--树2


下一篇:王道数据结构伪代码实现——第五章 树与二叉树