二叉树的三种遍历方式
-
先序遍历:按照根节点->左子树->右子树的顺序访问二叉树
-
中序遍历:按照左子树->根节点->右子树的顺序访问
-
后序遍历:按照左子树->右子树–>根节点的顺序访问
已知先序,中序,求后序
#include<iostream> #include<cstring> using namespace std; string a,b; void work(int al,int ar,int bl,int br){ int bk;//保存中序遍历中根节点位置 for(int i=bl;i<br;i++){ if(b[i]==a[al]){ bk=i; break; } } int ln=bk-bl;//左子树节点个数 int rn=br-(bk+1);//右子树节点个数 if(ln>0){ work(al+1,al+1+ln,bl,bl+ln); } if(rn>0){ work(ar-rn,ar,bk+1,bk+1+rn); } cout<<a[al];//最后输出根节点 return; } int main(){ cin>>b>>a; int l=a.length(); work(0,l,0,l);//先序遍历查找范围[0,l),后序遍历查找范围[0,l) return 0; }
已知中序,后序,求先序
#include<iostream> #include<cstring> using namespace std; string a,b; /*void work(int al,int ar,int bl,int br){ if (al > ar || bl > br) { return; } cout<<b[br]; for (int k = al; k <= ar; k++) { if (a[k] == b[br]) { work(al, k-1, bl, bl+k-al-1); work(k+1, ar, bl+k-al, br-1); break; } } }*/ void work(int al,int ar,int bl,int br){\ if (al > ar || bl > br) { return; } cout<<b[br]; int k; for(int i=al;i<=ar;i++){ if(a[i]==b[br]){ k=i; break; } } int ln=k-al,rn=ar-k; work(al,al+ln-1,bl,bl+ln-1); work(k+1,ar,bl+ln,br-1); } int main(){ cin>>a>>b; int l=a.length()-1; work(0,l,0,l); return 0; }