/*根据二叉树的前序序列和中序序列建立该二叉树。这个过程是
*一个递归过程,其基本思想是:先跟据前序序列的第一个元素建立
*根节点,然后在中序序列中找到该元素,确定根节点的左、右子树的中序序列;
*再再前序序列中确定左、右子树的前序序列;最后由左子树的前序序列与中序序列
*建立左子树,由右子树的前序序列与中序序列建立右子树。
*(由后序和中序建立二叉树的思想与上面类似)
*/
#include <cstdio>
#include <cstdlib>
#include <string>
#include <iostream>
using namespace std;
string pre, pin; //先序和中序序列
typedef struct node { //树的节点
char data;
struct node *lchild;
struct node *rchild;
} BiNode,*BiTree;
int find(BiNode *T, string pre, int pos); //查找根节点在中序序列中的位置
void create(BiTree &root, int i1, int i2, int length); //根据先序和中序序列创建二叉树
void postOrder(BiTree T); //后序遍历二叉树
int find(char c, string pin, int pos){
for(int i=pos; pin[i]!='\0'; i++){
if(c==pin[i]) return i;
}
return -1;
}
void create(BiTree &root, int i1, int i2, int length){ //i1为先序序列起始下标,i2为中序序列起始下标,length为序列长度
if(length<=0) root=NULL;
else{
root = (BiNode *)malloc(sizeof(BiNode));
root->data = pre[i1]; //根节点为线序序列中第1个元素
int pos = find(pre[i1],pin,i2); //查找根节点在中序序列中的位置
int leftlen = pos-i2; //左子树的长度
int rightlen = length-(leftlen+1); //右子树的长度
create(root->lchild, i1+1, i2, leftlen); //递归建立左子树
create(root->rchild, i1+leftlen+1, pos+1, rightlen); //递归建立右子树
}
}
/*由后序和中序构造二叉树
void create(BiTree &root, int i1, int i2, int length){ //i1为后序序列最后一个元素下标(其他同上)
if(length<=0) root=NULL;
else{
root = new BiNode;
root->data = post[i1];
int pos = find(post[i1],pin,i2);
int leftlen = pos-i2;
int rightlen = length-(leftlen+1);
create(root->lchild, i1-1-rightlen, i2, leftlen);
create(root->rchild, i1-1, pos+1, rightlen);
}
}
*/
void postOrder(BiTree T){
if(T==NULL) return;
else{
postOrder(T->lchild);
postOrder(T->rchild);
cout<<T->data<<' ';
}
}
int main(){
cin>>pre>>pin;
BiTree T;
create(T,0,0,pre.length());
postOrder(T);
return 0;
}
二叉树,已知先序和中序求后序,已知后序和中序求先序
最新推荐文章于 2020-05-30 13:12:47 发布