不难理解,中序是关键点,它是用于区别左右子树。
而先序和后序都是用来查找根节点的。
1/先序:第一个元素一定是根结点。
2/后序:最后一个节点一定是根结点。
解决问题的清晰点:可将先序和后序的查找定格在某个层次,使用递归的方式,将复杂的问题,分解成相似的子问题进行处理。
上代码:
#include<iostream> #include<string> #include<cstring> #include<queue> #include<stack> #include<map> #include<vector> using namespace std; void preT(int * inorder, int * postorder,int len){//m,b已知中序和后序 if(len==0){ return ; } int idx=0; cout<<postorder[len-1]<<" "; for(idx=0;postorder[len-1]!=inorder[idx];idx++); //左子树 preT(inorder,postorder,idx); //右子树 preT(inorder+idx+1,postorder+idx,len-idx-1); } void postT(int * preorder,int * inorder,int len){//已知先序和中序 if(len==0) return ; int rootindex=0; int root=preorder[0]; for(rootindex=0;preorder[0]!=inorder[rootindex];rootindex++); //左子树 postT(preorder+1,inorder,rootindex); //右子树 postT(preorder+rootindex+1,inorder+rootindex+1,len-rootindex-1); cout<<preorder[0]<<" "; } int main(){ int a[8]={1,2,3,4,6,7,5,8}; int m[8]={2,1,6,4,7,3,8,5}; int b[8]={2,6,7,4,8,5,3,1}; preT(m,b,8); cout<<endl; postT(a,m,8); } /* 1 2 3 4 6 7 5 8 2 1 6 4 7 3 8 5 2 6 7 4 8 5 3 1 */