POJ 2255 Tree Recovery 二叉树的遍历

  前序和中序输入二叉树,后序输出二叉树:核心思想只有一个,前序的每个根都把中序分成了两部分,例如

  DBACEGF ABCDEFG

  D把中序遍历的结果分成了ABC和EFG两部分,实际上,这就是D这个根的左右子树,而接下来的B,把ABC分成了A和C两部分,那么,A,C实际上是B的左右子树而E把EFG分成了空集和FG两部分,也就是说,E只有右子树,F把FG分成了空集和G两部分,即F只有右子树G。个人认为理解了思路以后,最重要的细节就是遍历 前序遍历 的结果时,你的那个p的增加(这里的P指的是要把前序遍历一个一个字符的扫一遍所用的变量)

还有就是C++的格式还是有很多不清楚,比如在一个类里面,只有static的变量才能直接赋初值,struct也可以有构造函数。。。

 

#include<cstdio>

#include<cstring>

#include<algorithm>

using namespace std;

const int maxn=26;

struct node{

    char data;

    node * left;

    node * right;

    node(){//initialise the value must be in a construct function

        data='?';

        left=NULL;

        right=NULL;

    }

};

int len;

char s1[maxn],s2[maxn];

struct twobranch_tree{

    node * root;

    int p;

    twobranch_tree(){

        root=new node;

        p=0;

    }

    void create(node *i,int l,int r){

        if(r==l){

            p++;

            i->data=s2[r];

            i->left=NULL;

            i->right=NULL;

            return;

        }

        if(p>=len)return;

        i->data=s1[p];

        int x=strchr(s2,s1[p])-s2;

        p++;

        if(x>l){

            i->left=new node;

            create(i->left,l,x-1);

        }

        if(x<r){

            i->right=new node;

            create(i->right,x+1,r);

        }



    }

    void LRN(node * i){

        if(i==NULL||i->data<65)return;

        LRN(i->left);

        LRN(i->right);

        printf("%c",i->data);

    }



};



int main(){

    while(scanf("%s%s",s1,s2)!=EOF){

        twobranch_tree tree;

        len=strlen(s1);

        tree.create(tree.root,0,len-1);

        tree.LRN(tree.root);

        printf("\n");

    }



    return 0;

}
Code

 

 

 

你可能感兴趣的:(tree)