剑指offer 重建二叉树
#include<iostream>
#include<vector>
using namespace std;
struct ListNode
{
int val;
struct ListNode *left;
struct ListNode *right;
ListNode(int x):
val(x),left(NULL),right(NULL){}
};
ListNode * recon(vector<int> pre, vector<int> vin)
{
if(pre.empty() || vin.empty())
return nullptr;
//建立根节点,为前序遍历中的第一个元素
ListNode *head = new ListNode(pre[0]);
//在中序遍历中寻找子树的根结点
int root;
for(int i=0; i<pre.size(); i++)
{
if(vin[i] == pre[0])
{
root = i;
break;
}
}
//定义新的左子树的前序、中序序列
vector<int> p,v;
for(int i=0; i < root; i++)
{
p.push_back(pre[i+1]);
v.push_back(vin[i]);
}
//定义新的右子树的前序、中序序列
vector<int> pr,vr;
for(int i= root+1; i<pre.size(); i++)
{
pr.push_back(pre[i]);
vr.push_back(vin[i]);
}
//新建左子树、右子树节点
head->left = recon(p,v);
head->right = recon(pr,vr);
//返回节点
return head;
}
void bianli(ListNode *p)
{
if(p!=NULL) cout<<p->val;
if(p->left!=NULL) bianli(p->left);
if(p->right!=NULL) bianli(p->right);
}
int main()
{
vector<int> pre = {1,2,4,7,3,5,6,8};
vector<int> vin = {4,7,2,1,5,3,8,6};
ListNode *p = recon(pre,vin);
bianli(p);
return 0;
}