已知前序遍历和中序遍历,重建二叉树

来源:互联网 发布:小猪生活通源码 编辑:程序博客网 时间:2024/06/05 20:38
//重建二叉树《剑指offer》面试6//已知前序遍历和中序遍历,重建二叉树#include<iostream>#include<stack>using namespace std;typedef struct treenode{        treenode *treeleft;        treenode *treeright;        int treevalue;}treenode;void postconverse(treenode *root){    if(root==NULL)        return ;    postconverse(root->treeleft);    postconverse(root->treeright);    cout<<root->treevalue<<" ";}void inconverse(treenode *root){    if(root==NULL)        return ;    inconverse(root->treeleft);    cout<<root->treevalue<<" ";    inconverse(root->treeright);}void preconverse(treenode *root){    if(root==NULL)        return ;    cout<<root->treevalue<<" ";    preconverse(root->treeleft);    preconverse(root->treeright);}treenode *constructcore(int *startpreorder,int *endpreorder,int *startinorder,int *endinorder){    int rootvalue=startpreorder[0];    treenode *root=new treenode;    root->treevalue=rootvalue;    root->treeleft=root->treeright=NULL;    if(startpreorder==endpreorder)    {        if(startinorder==endinorder && *startpreorder==*startinorder)            return root;        else        {            cout<<"invalid input";            return NULL;        }    }    int *rootinorder=startinorder;    while(rootinorder<=endinorder && *rootinorder!=rootvalue)        rootinorder++;    if(rootinorder==endinorder && *rootinorder!=rootvalue)        return NULL;    int leftlength=rootinorder-startinorder;    int *leftpreorderend=startpreorder+leftlength;    if(leftlength>0)        root->treeleft=constructcore(startpreorder+1,leftpreorderend,startinorder,rootinorder-1);    if(leftlength<endpreorder-startpreorder)        root->treeright=constructcore(leftpreorderend+1,endpreorder,rootinorder+1,endinorder);    return root;}treenode *constructnode(int *preorder,int *inorder,int length){    if(preorder==NULL && inorder==NULL && length<=0)        return NULL;    else        return constructcore(preorder,preorder+length-1,inorder,inorder+length-1);}int main(){    int preorder[]={1,2,4,7,3,5,6,8};    int inorder[]={4,7,2,1,5,3,8,6};    int postorder[]={7,4,2,5,8,6,3,1};    treenode *root;    root=constructnode(preorder,inorder,sizeof(preorder)/sizeof(preorder[0]));    cout<<"前序遍历:";    preconverse(root);    cout<<endl<<"中序遍历:";    inconverse(root);    cout<<endl<<"得到后序遍历:";    postconverse(root);    return 0;}


原创粉丝点击