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

## 题目描述

#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());
}

• 本文已收录于以下专栏：

## 根据先序和中序还原(重建)一个二叉树

package tree.BinaryTree;import java.util.Arrays;/** * 根据先序和中序还原一个二叉树 * * @author yuzhiyun * */...
• yuzhiyun3536
• 2016年12月05日 16:06
• 484

## 先序中序还原二叉树 和 中序后序还原二叉树 总结

• qq_40709140
• 2017年12月14日 21:42
• 67

## 给出先序和中序序列，还原二叉树的规律方法

• lws123253
• 2016年07月31日 16:03
• 379

## 【牛客网】重建二叉树

• 2016年08月18日 15:03
• 271

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

• liu_sheng_1991
• 2016年06月29日 16:42
• 989

## 牛客网刷题之重建二叉树

• lks1139230294
• 2016年10月02日 11:21
• 275

## 浙大模拟（1）问题 C: 还原二叉树

• linCurry
• 2017年03月12日 12:04
• 203

## 二叉树三种遍历及还原

• hemerry
• 2016年10月28日 17:54
• 992

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

//给出先序序列，中序序列恢复出二叉树的方法 //方法1：利用递归的方法，首先先找出根节点，然后有先序和后序的特点可知：先序序列中在根节点左边的是左子树，根节点右面的是右子树 //有此来，进行递归...
• qq_28633157
• 2015年11月15日 21:14
• 444

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

• wsyxhwj
• 2016年05月20日 21:49
• 856

举报原因： 您举报文章：牛客网的题，重建二叉树。（用树的先序，中序，还原二叉树） 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)