题解
- 这里采用的方法是先根据先序遍历序列创建链树,再看其的广度优先遍历序列是否和数组存储序列相同。需要注意的是这里创建链树要将叶子结点的孩子也创建结点,并将data置为‘#’,即以data为‘#’的结点代替原先的NULL结点。而且数组存储序列一般都不是满二叉树,所以在BFS时要以其作为循环终止条件。
题目
问题 E: DS二叉树判断--同一棵二叉树?
时间限制: 1 Sec 内存限制: 128 MB
提交: 107 解决: 71
[提交][状态][讨论版]
题目描述
二叉树分别以数组存储方式创建、以先序遍历序列创建。输入二叉树的数组存储、先序遍历结果,判断根据它们创建的二叉树是否是同一棵二叉树。
输入
测试次数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 <queue>
using namespace std;
class BiTNode
{
char data;
BiTNode *lchild, *rchild;
friend class BiTree;
};
class BiTree
{
BiTNode *tree;
string a;
void PreOrderTraverse(BiTNode *&p);
public:
BiTree(){cin>>a;}
void PreOrder();
void BFSTraverse();
};
void BiTree::PreOrder()
{
PreOrderTraverse(tree);
}
void BiTree::PreOrderTraverse(BiTNode *&p)
{
char ch;
cin>>ch;
if(ch!='#')
{
p = new BiTNode;
p->data = ch;
PreOrderTraverse(p->lchild);
PreOrderTraverse(p->rchild);
}
else
{
p = new BiTNode;
p->data = '#';
p->lchild = NULL;
p->rchild = NULL;
}
}
void BiTree::BFSTraverse()
{
int i = 0;
BiTNode *p;
queue<BiTNode *> Q;
Q.push(tree);
while(i!=a.length())
{
p = Q.front();
Q.pop();
if(p)
{
if(p->data!=a[i])
{
cout<<"NO"<<endl;
return;
}
Q.push(p->lchild);
Q.push(p->rchild);
}
i++;
}
cout<<"YES"<<endl;
}
int main(void)
{
int t;
cin>>t;
while(t--)
{
BiTree myTree;
myTree.PreOrder();
myTree.BFSTraverse();
}
}