目录
前言
本人刷剑指offer的一些程序记录,头文件,主函数都齐全,可直接上机运行
一、题目
输⼊某 ⼆叉树 的前序遍历和中序遍历的结果,请重建出该 ⼆叉树 。假设输⼊的前序遍历和中序遍历的结果中都不含重复的数字。例如:输⼊前序遍历序列 {1,2,4,7,3,5,6,8}和中序遍历序列 {4,7,2,1,5,3,8,6} ,则重建⼆叉树并返回。
二、程序
1.头文件
#include <iostream>
#include <vector>
using namespace std;
2.类和主函数
typedef struct BiNode
{
int val;
BiNode *lchild;
BiNode *rchild;
}*BiTree;
class solution
{
public:
BiTree ReCreateTree(vector<int> preV,vector<int> inV)
{
if(preV.size()==0) return NULL;
vector<int> pre_left,pre_right,in_left,in_right;
BiTree head=new BiNode;
head->val=preV[0];
head->lchild=head->rchild=NULL;
int root=0;//head根节点在中序序列中的位置
for(int i=0;i<preV.size();i++)
{
if(preV[0]==inV[i])
{
root=i;
break;
}
}
for(int i=0;i<root;i++)
{
pre_left.push_back(preV[i+1]);
in_left.push_back(inV[i]);
}
for(int i=root+1;i<preV.size();i++)
{
pre_right.push_back(preV[i]);
in_right.push_back(inV[i]);
}
head->lchild=ReCreateTree(pre_left,in_left);//递归
head->rchild=ReCreateTree(pre_right,in_right);
return head;
}
};
int main()
{
vector<int> preV,inV;
int n,data;
cout<<"请输入数组的初始长度:"<<endl;
cin>>n;
cout<<"请初始化前序序列"<<endl;
for(int i=0;i<n;i++)
{
cin>>data;
preV.push_back(data);
}
cout<<"请初始化中序序列"<<endl;
for(int i=0;i<n;i++)
{
cin>>data;
inV.push_back(data);
}
cout<<"二叉树重建完成"<<endl;
cout<<"二叉树根节点的值为:"<<endl;
solution stu;
cout<<stu.ReCreateTree(preV,inV)->val<<endl;
}