poj2255 Tree Recovery

 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);
    }
}

 

posted @ 2012-10-07 16:26  sidereal  Views(190)  Comments(0)    收藏  举报