#include <iostream>
using namespace std;
struct BinaryTreeNode{
int data;
BinaryTreeNode* lchild;
BinaryTreeNode* rchild;
};
BinaryTreeNode* Rebuilt(int *pre,int* preEnd,int* in,int* inEnd){
BinaryTreeNode* root = new BinaryTreeNode;
root->data = pre[0];
root->lchild = root->rchild = NULL;
if(pre == preEnd){ //循环结束条件
return root;
}
int* curP = in;
while(*curP != pre[0] && in < inEnd){ //寻找中序和先序相同的节点
curP++;
}
int LchildSize = curP - in;
int* LchildEnd = pre + LchildSize ;
if(LchildSize > 0){
root->lchild = Rebuilt(pre+1,pre+LchildSize,in,curP-1); //控制左节点范围进行递归
}
if((preEnd - pre) > LchildSize){
root->rchild = Rebuilt(pre+LchildSize+1,preEnd,curP+1,inEnd);
}
return root;
}
BinaryTreeNode* Start(int* pre,int* in,int size){
if(pre == NULL || in == NULL){
return NULL;
}
return Rebuilt(pre,pre+size-1,in,in+size-1); //控制左右子节点的范围
}
void PreOrder(BinaryTreeNode* root){
if(root != NULL){
cout << root->data << " ";
PreOrder(root->lchild);
PreOrder(root->rchild);
}
}
void InOrder(BinaryTreeNode* root){
if(root != NULL){
InOrder(root->lchild);
cout << root->data << " ";
InOrder(root->rchild);
}
}
void PostOrder(BinaryTreeNode* root){
if(root != NULL){
PostOrder(root->lchild);
PostOrder(root->rchild);
cout << root->data << " ";
}
}
int main()
{
int Pre[] = {1,2,4,7,3,5,6,8};
int In[] = {4,7,2,1,5,3,8,6};
int Size = sizeof(Pre)/sizeof(int); //获取长度,以便得到尾指针
BinaryTreeNode *root = Start(Pre,In,Size);
cout << "先序遍历: " ;
PreOrder(root);
cout << endl;
cout << "中序遍历: " ;
InOrder(root);
cout << endl;
cout << "后序遍历: " ;
PostOrder(root);
return 0;
}