1. 判断二叉树是否相同,左右孩子互换也认为相同,要求纸上写出全部代码
#include <iostream>
using namespace std;
typedef struct AA{
AA *l, *r;
int data;
}Node;
Node tree1[10];
Node tree2[10];
/*
bool bitree_cmp(Node *n1, Node *n2)
{
int cnt1 = 0, cnt2=0;
bool ans = false;
if ( n1 == NULL && n2 == NULL )
return true;
if ( (n1 == NULL && n2 != NULL) || (n1 != NULL && n2 == NULL))
return false;
if ( n1->data != n2->data )
return false;
if ( n1->l )
++cnt1;
if ( n2->r )
++cnt1;
if ( n2->l )
++cnt2;
if ( n2->r )
++cnt2;
if ( cnt1 != cnt2 )
return false;
if ( cnt1 == 0 )
return true;
ans = bitree_cmp(n1->l, n2->l) && bitree_cmp(n1->r, n1->r);
if ( ans )
return true;
ans = bitree_cmp(n1->l, n2->r) && bitree_cmp(n1->r, n2->l);
return ans;
}
*/
bool bitree_cmp(Node *n1, Node *n2)
{
if ( n1 == NULL && n2 == NULL )
return true;
if ( n1 != NULL && n2 != NULL )
{
if ( n1->data == n2->data )
{
return ( bitree_cmp(n1->l, n2->l)&&bitree_cmp(n1->r, n2->r) ) || ( bitree_cmp(n1->l, n2->r)&&bitree_cmp(n1->r, n2->l) );
}
}
return false;
}
void read_data(Node *tree, int i)
{
int data, l , r;
scanf("%d%d%d",&data, &l, &r);
tree[i].data = data;
if ( l )
tree[i].l = &tree[l];
else
tree[i].l = NULL;
if ( r )
tree[i].r = &tree[r];
else
tree[i].r = NULL;
}
int main()
{
int n1, n2;
int l, r, data;
int i = 0;
scanf("%d", &n1);
while(n1--)
{
read_data(tree1, i);
++i;
}
scanf("%d", &n2);
i = 0;
while(n2--)
{
read_data(tree2, i);
++i;
}
cout<<bitree_cmp(tree1, tree2)<<endl;
cin>>i;
return 0;
}
/*
测试数据:
1 1
2 2 2 2
3 4 6 7 6 7 4 3
从这开始:
7
1 1 2
2 3 4
2 5 6
3 0 0
4 0 0
6 0 0
7 0 0
7
1 1 2
2 3 4
2 5 6
7 0 0
6 0 0
3 0 0
4 0 0
7
1 1 2
2 3 4
2 5 6
3 0 0
4 0 0
6 0 0
7 0 0
7
1 1 2
2 3 4
2 5 6
3 0 0
4 0 0
6 0 0
7 0 0
*/