POJ 2255 Tree Recovery 二叉树的遍历

时间:2022-08-11 07:39:33

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

  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;
;
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=;
    }
    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-);
        }
        if(x<r){
            i->right=new node;
            create(i->right,x+,r);
        }

    }
    void LRN(node * i){
        )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,,len-);
        tree.LRN(tree.root);
        printf("\n");
    }

    ;
}

Code