已知前序遍历和中序遍历,重建二叉树
来源:互联网 发布:小猪生活通源码 编辑:程序博客网 时间: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;}