//重建二叉树
//例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
struct TreeNode{
int val;
TreeNode* left;
TreeNode* right;
};
//重建二叉树
TreeNode* ReConstructTree(vector<int> &pre,vector<int> &vin)
{
int len = vin.size();
if(len == 0)
return NULL;
TreeNode* head = new TreeNode;
head->val = pre[0];
head->left = nullptr;
head->right = nullptr;
int n = 0;
for(int i = 0;i < vin.size();i++)
{
if(vin[i] == pre[0])
n = i;
break;
}
vector<int> pre_left,pre_right,vin_left,vin_right;
for(int i = 0; i < n;i++)
{
pre_left.push_back(pre[i+1]);
vin_left.push_back(vin[i]);
}
for(int i = n+1;i < vin.size();i++)
{
pre_right.push_back(pre[i]);
vin_right.push_back(vin[i]);
}
head->left = ReConstructTree(pre_left,vin_left);
head->right = ReConstructTree(pre_right,vin_right);
return head;
}
//前序遍历二叉树
void PreShowTreeNode(TreeNode* arr)
{
if(arr == NULL)
return;
int n = arr->val;
cout<<n<<" ";
if(arr->left != NULL)
PreShowTreeNode(arr->left);
if(arr->right != NULL)
PreShowTreeNode(arr->right);
}
//后续遍历二叉树
void BackShowTreeNode(TreeNode* arr)
{
if(arr == NULL)
return;
if(arr->left != NULL)
PreShowTreeNode(arr->left);
if(arr->right != NULL)
PreShowTreeNode(arr->right);
int n = arr->val;
cout<<n<<" ";
}
void print(vector<int> arr)
{
vector<int>::iterator it = arr.begin();
for(;it != arr.end();it++)
cout<<*it<<" ";
cout<<endl;
}
int main(){
vector<int> pre;
vector<int> vin;
pre.push_back(1);
pre.push_back(2);
pre.push_back(4);
pre.push_back(7);
pre.push_back(3);
pre.push_back(5);
pre.push_back(6);
pre.push_back(8);
vin.push_back(4);
vin.push_back(7);
vin.push_back(2);
vin.push_back(1);
vin.push_back(5);
vin.push_back(3);
vin.push_back(8);
vin.push_back(6);
cout<<"pre; ";
print(pre);
cout<<"vin: ";
print(vin);
cout<<"############################"<<endl;
TreeNode* head = ReConstructTree(pre,vin);
PreShowTreeNode(head);
cout<<endl;
BackShowTreeNode(head);
return 0;
}