1 #include <stdio.h>
2 #include <string.h>
3
4 char preorder[30];
5 char inorder[30];
6 char tree[1000000]; //tree index starts from 1 //树的深度问题,2^h数组大小,选得太小会AW
7 char postorder[30];
8 int postindex;
9 int search(char ch,char array[],int start,int end)
10 {
11 for(int i=start;i<=end;i++)
12 if(array[i]==ch)
13 return i;
14 }
15 void divide(int pr,int pe,int ir, int ie, int subtree)
16 {
17 char root=preorder[pr];
18 tree[subtree]=root;
19 int n=search(root,inorder,ir,ie);
20 int leftLen=n-ir;
21 int rightLen=ie-n;
22 if(leftLen>0)
23 divide(pr+1,pr+1+leftLen-1,ir,n-1,subtree*2);
24 if(rightLen>0)
25 divide(pr+leftLen+1,pe,n+1,ie,subtree*2+1);
26 }
27
28 void postVisit(int root)
29 {
30 if(tree[root]!=0)
31 {
32 postVisit(root*2);
33 postVisit(root*2+1);
34 postorder[postindex++]=tree[root];
35 }
36 }
37 int main()
38 {
39 int plen,ilen;
40 while(scanf("%s %s",preorder,inorder)!=EOF)
41 {
42 plen=strlen(preorder);
43 ilen=strlen(inorder);
44 memset(tree,0,sizeof(tree));
45 divide(0,plen-1,0,ilen-1,1); //last 0 represents root.
46 //post visit
47 postindex=0;
48 postVisit(1);
49 postorder[plen]='\0';
50 printf("%s\n",postorder);
51 }
52 }
为解决上面的树深度大导致需很大的index空间的问题
如下:
#include <stdio.h>
#include <string.h>
struct Node
{
char value;
int left;
int right;
};
char preorder[30];
char inorder[30];
Node tree[100]; //tree index starts from 1
char postorder[30];
int postindex;
int treeindex;
int search(char ch,char array[],int start,int end)
{
for(int i=start;i<=end;i++)
if(array[i]==ch)
return i;
}
void divide(int pr,int pe,int ir, int ie, int subtree)
{
char root=preorder[pr];
tree[subtree].value=root;
int n=search(root,inorder,ir,ie);
int leftLen=n-ir;
int rightLen=ie-n;
if(leftLen>0)
{
tree[subtree].left=(++treeindex);
divide(pr+1,pr+1+leftLen-1,ir,n-1,tree[subtree].left);
}
if(rightLen>0)
{
tree[subtree].right=(++treeindex);
divide(pr+leftLen+1,pe,n+1,ie,tree[subtree].right);
}
}
void postVisit(int root)
{
if(tree[root].left!=0)
postVisit(tree[root].left);
if(tree[root].right!=0)
postVisit(tree[root].right);
postorder[postindex++]=tree[root].value;
}
int main()
{
int plen,ilen;
while(scanf("%s %s",preorder,inorder)!=EOF)
{
//init
plen=strlen(preorder);
ilen=strlen(inorder);
treeindex=0;
postindex=0;
memset(tree,0,sizeof(tree));
divide(0,plen-1,0,ilen-1,0); //last 0 represents root.
//post visit
postVisit(0);
postorder[plen]='\0';
printf("%s\n",postorder);
}
}