#include<stdio.h> #include<stdlib.h> #include<queue> using namespace std; int POST[32]; //存放后序遍历 int IN[32]; //存放中序遍历 int n; //节点数 struct node { int data; node* l; node* r; }; node* creat(int postL,int postR,int inL,int inR) { if(postL>postR) //表明后续已经遍历完了 return NULL; node* root=(node*)calloc(1,sizeof(node)); //或者写成 node* root=new node; 而calloc会自动初始化root更方便 root->data=POST[postR]; root->l=NULL; root->r=NULL; int tmp=0; //标记postR这个元素在中序遍历下的位置 for(tmp=inL ; tmp<=inR ; ++tmp) if(IN[tmp]==root->data) break; int numleft=tmp-inL; //【思维】后序遍历中,前numleft个数字都是后续根的左子树 root->l=creat(postL, postL+numleft-1, inL, tmp-1); //【caution】这里的下标千万注意!!! root->r=creat(postL+numleft , postR-1 , tmp+1 , inR); //写这步的时候最好画图 return root; //返回根地址 } void BFS(node* root) { queue<node*> q; //创建队列 q.push(root); int num=0; //记录输出个数,控制空格数量 while(!q.empty()) { ++num; node* tmp=q.front(); q.pop(); printf("%d",tmp->data); if(num<n) printf(" "); if(tmp->l!=NULL) q.push(tmp->l); if(tmp->r!=NULL) q.push(tmp->r); } } void DFS(node* root) { if(root==NULL) return; printf("%d ",root->data); DFS(root->l); DFS(root->r); } int main() { scanf("%d",&n); for(int i=0 ; i<n ; ++i) scanf("%d",&POST[i]); for(int i=0 ; i<n ; ++i) scanf("%d",&IN[i]); node* root=creat(0,n-1,0,n-1); //DFS(root); //先序遍历,测试建树情况 BFS(root); return 0; }
时间: 2024-10-14 22:15:45