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