//============================================================================ // Name : 编程之美重建二叉树.cpp // Author : // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //============================================================================ #include <iostream> #include<stdio.h> #include<stdlib.h> using namespace std; class Node { public: char value; Node*left; Node*right; Node(char value1='/0'):value(value1),left(NULL),right(NULL){} }; bool rebuildTreeRepeat(Node**head,const char*preOrder,const char*midOrder,int curr,int end) { if(curr>end) { *head=NULL; return true; } char temp=*preOrder; unsigned int i; int temp1=0; for(i=curr;i<=end;i++) { if(midOrder[i]==temp) { if(i>end) { *head=NULL; return false; //检测出不合理的前序序列,中序序列 } *head=new Node(temp); if(rebuildTreeRepeat(&((*head)->left),preOrder+1,midOrder, curr,i-1)&&rebuildTreeRepeat(&((*head)->right),preOrder+i-curr+1,midOrder,i+1,end)) temp1=1; } } if(temp1==0) return false; return true; } bool rebuildTree(Node**head,const char*preOrder,const char*midOrder,int curr,int end) { if(curr>end) { *head=NULL; return true; } char temp=*preOrder; unsigned int i; for(i=curr;i<=end&&midOrder[i]!=temp;i++) ; if(i>end) { *head=NULL; return false; //检测出不合理的前序序列,中序序列 } *head=new Node(temp); rebuildTree(&((*head)->left),preOrder+1,midOrder, curr,i-1); rebuildTree(&((*head)->right),preOrder+i-curr+1,midOrder,i+1,end); return true; } void trans(const Node *head) { if(head) { cout<<head->value<<" "; trans(head->left); trans(head->right); } } bool CreateTree(Node**head,char*preOrder,char*midOrder) { int len1=strlen(preOrder); int len2=strlen(midOrder); if(len1<=0||len2<=0) return false; if(len1!=len2) return false; //return rebuildTree(head,preOrder,midOrder,0,len1-1); return rebuildTreeRepeat(head,preOrder,midOrder,0,len1-1); } int main() { char preOrder[20]="abacaa"; char midOrder[20]="abaaca"; Node*head=NULL; if(CreateTree(&head,preOrder,midOrder)) trans(head); else cout<<"error"<<endl; return 0; }