已知前序中序建树
struct node *creat(int n, char *s1, char *s2)
{
int i;
if(n == 0)
return NULL;
struct node *root;
root = new node;
root -> data = s1[0];
for(i = 0; i < n; i++)
{
if(s2[i] == s1[0])
break;
}
root -> l = creat(i, s1 + 1, s2);
root -> r = creat(n - 1 - i, s1 + i + 1, s2 + i + 1);
return root;
}
已知中序后序建树
struct node *creat(int n, char *s1, char *s2)
{
int i;
if(n == 0)
return NULL;
struct node *root;
root = new node;
root -> data = s2[n-1];
for(i = 0; i < n; i++)
{
if(s1[i] == s2[n-1])
break;
}
root -> l = creat(i, s1, s2);
root -> r = creat(n - 1 - i, s1 + i + 1, s2 + i );
return root;
}
层序遍历
void chen(tree *root)
{
tree *p[101];
int flas=0;
int glas=0;
if(root)
p[flas++]=root;
while(flas>glas)
{
root=p[glas++];
printf("%c",root->data);
if(root->l)
p[flas++]=root->l;
if(root->r)
p[flas++]=root->r;
}
}
求叶子数
int sum(tree *root)
{
if(!root)
return 0;
if(!root->l&&!root->r)
return 1;
else
return sum(root->l)+sum(root->r);
}
求树的高度
int deep(node *root)
{
if(!root)
return 0;
else
{
int a,b;
a=deep(root->l);
b=deep(root->r);
if(a<b)
a=b;
return 1+a;
}
}
树的同构
int judge(int i,int j)
{
if(t1[t1[i].l].data==t2[t2[j].l].data&&t1[t1[i].r].data==t2[t2[j].r].data) return 1;
if(t1[t1[i].l].data==t2[t2[j].r].data&&t1[t1[i].r].data==t2[t2[j].l].data) return 1;
return 0;
}
void ok()
{
int i,j;
int flag=0;
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
if(t1[i].data==t2[j].data)
{
if(judge(i,j)==0)
{
flag=1;
break;
}
else break;
}
}
if(j==m)
{
flag=1;
break;
}
}
if(flag) printf("No\n");
else printf("Yes\n");
}