按先序遍历序列建立两个二叉树的二叉链表 A 和链表 B ,设计算法判断 A 、 B 二叉树是否相似。
注:其中“#”表示的是空格,空格字符代表空树。
测试输入
ab#c##d##↵
xc#v##b##↵
期待的输出
A与B相似↵
测试输入
ab#c##d##↵
gv##d##↵`
期待的输出
A与B不相似↵
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
class binarytreenode {
public:
char data;
binarytreenode * Lchild, * Rchild;
binarytreenode() { Lchild = NULL; Rchild = NULL; }
};
class binarytree {
public:
binarytreenode * root;
binarytree() { root =NULL; }
void createtree( binarytreenode * &p)
{
char ch;
cin >> ch;
if (ch == '\n')
return;
if (ch == '#')
p = NULL;
else
{
p = new binarytreenode();
if (!p)
exit(-1);
p->data = ch;
createtree(p->Lchild);
createtree(p->Rchild);
return;
}
}
};
bool similar(binarytreenode *t1, binarytreenode *t2)
{
bool leftS = false, rightS = false;
if (t1 == NULL && t2 == NULL) // 两树皆空
return true;
else if (t1 == NULL || t2 == NULL) // 只有一个树为空
return false;
else // 递归地进行判断
{
leftS = similar(t1->Lchild, t2->Lchild);
rightS = similar(t1->Rchild, t2->Rchild);
return leftS && rightS;
}
}
int main()
{
binarytree x, t;
x.createtree(x.root);
t.createtree(t.root);
bool flag;
flag=similar(x.root, t.root);
if (flag)
cout << "A与B相似\n";
else
cout << "A与B不相似\n";
return 0;
}