前序加中序求二叉树后序序列

来源:互联网 发布:新郎接亲游戏知乎 编辑:程序博客网 时间:2024/05/29 18:02
#include <map>#include <set>#include <stack>#include <queue>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int maxn=1000;char pre[maxn],in[maxn];struct Node {    char val;    Node *left,*right;    Node(char v=0,Node *l=NULL,Node *r=NULL):val(v),left(l),right(r){}};Node *makeTree(int i,int j,int size) //i表示前序遍历序列的开始下标,j是中序遍历的下标,size表示序列长度{    if(size==0) //size为空说明子树为空树,返回NULL        return NULL;    int root;    for(int k=j;k<j+size;k++) //选择前序遍历中的根在中序遍历序列中的位置,由此确定左右子树的节点个数,root一定可以找到    {        if(pre[i]==in[k])        {            root=k;break;        }    }    int leftNum=root-j; //左子树的节点个数    int rightNum=size-leftNum-1;//右子树的节点个数    Node *left=makeTree(i+1,j,leftNum);//i+1为左子树的根    Node *right=makeTree(i+leftNum+1,root+1,rightNum);//i+leftNum+1为右子树的根    Node *r=new Node(pre[i],left,right);//生成根节点    return r;}void deleteTree(Node *root)//递归删除树{    if(root==NULL) return;    deleteTree(root->left);    deleteTree(root->right);    delete root;}void postOrder(Node *root){    if(!root) return;    postOrder(root->left);    postOrder(root->right);    printf("%c",root->val);}int main(){#ifdef LOCAL_DEBUGfreopen("input.txt","r",stdin);#endif    while(~scanf("%s%s",pre,in))    {        Node *root = makeTree(0,0,strlen(pre));        postOrder(root);        deleteTree(root);    }    return 0;}

0 0
原创粉丝点击