#include <iostream>
#include <queue>
using namespace std;
const int maxn=63;
char pre[maxn]={'a','b','d','e','c'};//先序遍历序列
char in[maxn]={'d','b','e','a','c'};//中序遍历序列
char po[maxn]={'d','e','b','c','a'};//后序遍历序列
char lay[maxn]={'a','b','c','d','e'};//层序遍历序列
struct node{
char data;
node* lchild;
node* rchild;
};
node* pre_in_creart(int preL,int preR,int inL,int inR){//通过先序序列与中序序列重建二叉树
if(preL>preR) return NULL;
node* root = new node; //创建节点
root->data=pre[preL];//根节点赋值,先序根节点为最左端节点
int k;
for(k=inL;k<=inR;k++){ //遍历寻找根节点在中序序列中的位置
if(in[k]==pre[preL])
break;
}
int numleft=k-inL; //numleft为根节点左子树的节点数量
root->lchild=pre_in_creart(preL+1,preL+numleft,inL,k-1); //先序序列从第preL+1个到第preL+numleft个为左子树节点
//中序序列从第inL到第k-1个节点为左子树节点,递归建立左子树
root->rchild=pre_in_creart(preL+numleft+1,preR,k+1,inR); //先序序列从第preL+numleft+1个到第preR个为右子树节点
//中序序列从第k+1到第inR个节点为右子树节点,递归建立右子树
return root;
}
node* post_in_creat(int poL,int poR,int inL,int inR){//通过后序序列与中序序列重建二叉树
if(poL>poR) return NULL;
node* root=new node;
root->data=po[poR];
int k;
for(k=inL;k<inR;k++)
if(in[k]==po[poR])
break;
int numright=inR-k;
root->lchild=post_in_creat(poL,poR-numright-1,inL,k-1);
root->rchild=post_in_creat(poR-numright,poR-1,k+1,inR);
return root;
}
void preOrder_visit(node* root){//先序访问
if(root==NULL) return;
printf("%c",root->data);
preOrder_visit(root->lchild);
preOrder_visit(root->rchild);
}
void inOrder_visit(node* root){//中序访问
if(root==NULL) return;
inOrder_visit(root->lchild);
printf("%c",root->data);
inOrder_visit(root->rchild);
}
void postOrder_visit(node* root){//后序访问
if(root==NULL) return;
postOrder_visit(root->lchild);
postOrder_visit(root->rchild);
printf("%c",root->data);
}
void LayerOrder_visit(node* root){//层序遍历
queue<node*> Q;
Q.push(root);
while(!Q.empty()){
node* now=Q.front();
Q.pop();
printf("%c",now->data);
if(now->lchild!=NULL) Q.push(now->lchild);
if(now->rchild!=NULL) Q.push(now->rchild);
}
}
int main(int argc, char** argv) {
node* tree=new node;
tree=pre_in_creart(0,4,0,4);
preOrder_visit(tree);
printf("\n");
inOrder_visit(tree);
printf("\n");
postOrder_visit(tree);
printf("\n");
LayerOrder_visit(tree);
printf("\n");
tree=post_in_creat(0,4,0,4);
preOrder_visit(tree);
printf("\n");
inOrder_visit(tree);
printf("\n");
postOrder_visit(tree);
printf("\n");
LayerOrder_visit(tree);
printf("\n");
return 0;
}
输出为:
abdec
dbeac
debca
abcde
abdec
dbeac
debca
abcde
参考《算法笔记》第九章
相关:PAT A1020