ACM

# 牛客网的题，重建二叉树。（用树的先序，中序，还原二叉树）

## 题目描述

#include<iostream>
#include <vector>
using namespace std;

struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

TreeNode* PreInCreat(vector<int> pre,vector<int> in,int l1,int h1,int l2,int h2)
{
int i;
TreeNode* root = new TreeNode(pre[l1]);
for(i=l2;in[i]!=root->val;i++);
int llen = i-l2;
int rlen = h2-i;
if(llen)
root ->left = PreInCreat(pre,in,l1+1,l1+llen,l2,l2+llen-1);
else
root ->left = NULL;
if(rlen)
root ->right = PreInCreat(pre,in,h1-rlen+1,h1,h2-rlen+1,h2);
else
root ->right = NULL;
return root;
}

TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> in)
{
//cout << pre.size();
return PreInCreat(pre,in,0,pre.size()-1,0,in.size()-1);
}

void PostOrderTravel(TreeNode* L)
{
if(L->left)
PostOrderTravel(L->left);
if(L->right)
PostOrderTravel(L->right);
cout << L->val << " ";
}

int main()
{
vector<int> pre{1,2,3,4,5,6};
vector<int> in{3,2,1,5,4,6};

//令i依次为ivec中的每一个元素，并显示
for(auto i : pre)
cout << i << " ";
cout << endl;

for(auto i : in)
cout << i << " ";
cout << endl;

//reConstructBinaryTree(pre, in);
TreeNode* root = reConstructBinaryTree(pre, in);
PostOrderTravel(root);
}

/**
* Definition for binary tree
* struct TreeNode {
*     int val;
*     TreeNode *left;
*     TreeNode *right;
*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
struct TreeNode* PreInCreat(vector<int> pre,vector<int> in,int l1,int h1,int l2,int h2)
{
int i;
TreeNode* root = new TreeNode(pre[l1]);
for(i=l2;in[i]!=root->val;i++);
int llen = i-l2;
int rlen = h2-i;
if(llen)
root ->left = PreInCreat(pre,in,l1+1,l1+llen,l2,l2+llen-1);
else
root ->left = NULL;
if(rlen)
root ->right = PreInCreat(pre,in,h1-rlen+1,h1,h2-rlen+1,h2);
else
root ->right = NULL;
return root;
}

struct TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> in) {
return PreInCreat(pre,in,0,pre.size()-1,0,in.size()-1);
}
};

/**
* Definition for binary tree
* struct TreeNode {
*     int val;
*     TreeNode *left;
*     TreeNode *right;
*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
struct TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> in) {
int length = in.size();
if (length == 0)
{
return NULL;
}
vector<int> left_pre, right_pre, left_in, right_in;
TreeNode *head = new TreeNode(pre[0]); //创建根节点
int root = 0; //根节点在中序遍历中的位置
for (int i = 0; i < length; i++)
{
if (in[i] == pre[0])
{
root = i;
break;
}
}

//对于中序遍历，根节点左边的节点属于左子树，根节点右边的节点属于右子树
for (int i = 0; i < root; i++)
{
left_in.push_back(in[i]);
left_pre.push_back(pre[i + 1]);
}

for (int i = root + 1; i < length; i++)
{
right_in.push_back(in[i]);
right_pre.push_back(pre[i]);
}

}
};

TreeNode* PreInCreat(vector<int> pre,vector<int> in,int l1,int h1,int l2,int h2)
{
int root_in_in;
TreeNode* root = new TreeNode(pre[l1]);
for(root_in_in = l2;in[root_in_in]!=root->val;root_in_in++);

int llen = root_in_in-l2;
int rlen = h2 - (root_in_in+1);
if(llen)
root->left = PreInCreat(pre,in,l1+1,l1+llen+1,l2,root_in_in);
else
root->left = NULL;
if(rlen)
//root->right = PreInCreat(pre,in,l1+llen+1,h1,root_in_in+1,h2);
root->right = PreInCreat(pre,in,h1-rlen,h1,root_in_in+1,h2);
else
root->right = NULL;

return root;
}

TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> in)
{
//cout << pre.size();
return PreInCreat(pre,in,0,pre.size(),0,in.size());
}

#### 由中序遍历序列和前序遍历序列重建二叉树

2018-03-06 19:33:54

#### [LeetCode] 根据中序和后序序列重建二叉树

2015-08-21 10:35:52

#### 已知二叉树的后序遍历和中序遍历重建二叉树(二叉树)

2017-01-28 10:20:11

#### 牛客网刷题--剑指offer(重建二叉树)

2016-06-29 16:42:36

#### pat--还原二叉树--根据后序中序输出先序

2016-04-18 19:58:54

#### 如何根据前序、中序、后序遍历还原二叉树

2015-04-21 20:49:38

#### 给出先序序列，中序序列恢复二叉树

2015-11-15 21:14:24

#### 根据中序遍历和后序遍历重建二叉树

2017-10-14 23:01:42

#### 由中根序列和后根序列重建二叉树

2017-04-30 23:22:14

#### 前序+中序 /前序+后序/中序+后序重建二叉树

2018-03-16 21:17:26