根据后序遍历和中序遍历求层序遍历(队列实现)
终于明白编程之美中为什么传递Node** root了,如果传递Node*root的话,你从外面新建一个root,传递进去只是作为参数,本身并没有改变,所以需要传递地址。
#include<stdio.h>
#include<stdlib.h>
#include<queue>
using namespace std;
int postorder[35];
int inorder[35];
int N;
struct Node{
int data;
Node* left;
Node* right;
};
queue<Node*> q;
void create_binary_tree(int* post,int* in,int len,Node** root){
if(len==0) return;
Node* node=new Node;
node->data=*post;
node->left=NULL;
node->right=NULL;
if(*root==NULL) *root=node;
if(len==1) return;
//查找子树的长度
int *tmp=in;
int i,pos;
for(i=0;i<len;i++)
if(*post==*(tmp+i)){
pos=i;
break;
}
int left_len=pos;
int right_len=len-pos-1;
//创建左子树
create_binary_tree(post-right_len-1,in,left_len,&node->left);
//创建右子树
create_binary_tree(post-1,in+left_len+1,right_len,&node->right);
}
void preorder(Node* root){
if(root!=NULL){
printf("%d",root->data);
preorder(root->left);
preorder(root->right);
}
}
int main(){
scanf("%d",&N);
for(int i=0;i<N;i++)
scanf("%d",&postorder[i]);
for(int i=0;i<N;i++)
scanf("%d",&inorder[i]);
Node* root=NULL;
create_binary_tree(postorder+N-1,inorder,N,&root);
//层序遍历
q.push(root);
int time=0;
while(!q.empty()){
time++;
Node* tmp=q.front();q.pop();
if(time==1)
printf("%d",tmp->data);
else
printf(" %d",tmp->data);
if(tmp->left!=NULL) q.push(tmp->left);
if(tmp->right!=NULL) q.push(tmp->right);
}
//system("pause");
return 0;
}