三种建树方法
首先定义一下树的结点
struct node{ int val; node* l; node* r; };
前序中序序列建立二叉树:
//in[]和pre[]数组存放二叉树的中序和前序遍历序列 node* build(int preL,int preR,int inL,int inR){ if(preL>preR) return NULL; node* root=(node*)malloc(sizeof(node)); int val=pre[preL]; root->val=val; int x; for(int i=inL;i<=inR;i++){ if(in[i]==val){ x=i; break; } } x=x-inL; root->l=build(preL+1,preL+x,inL,inL+x-1); root->r=build(preL+1+x,preR,inL+x+1,inR); return root; }
后序中序序列建立二叉树:
//in[]和post[]数组存放二叉树的中序和后序遍历序列 node* build(int postL,int postR,int inL,int inR){ if(inL>inR) return NULL; node* root=(node*)malloc(sizeof(node)); root->val=post[postR]; int x; for(int i=inL;i<=inR;i++){ if(in[i]==root->val){ x=i; break; } } x=x-inL; //x表示左子树结点的个数 root->l=build(postL,postL+x-1,inL,inL+x-1); root->r=build(postL+x,postR-1,inL+x+1,inR); return root; }
层序中序序列建立二叉树:
//in[]和level[]数组存放二叉树的中序和层序遍历序列 node* build(int levL,int levR,int inL,int inR){ if(inL>inR) return NULL; int k,flag=0; while(levL<=levR){ for(k=inL;k<=inR;k++){ if(in[k]==level[levL]){ flag=1; break; } } if(flag==1) break; levL++; } node* root=(node*)malloc(sizeof(node)); root->val= in[k]; k=k-inL; root->l=build(levL,levR,inL,inL+k-1); root->r=build(levL,levR,inL+k+1,inR); return root; }