0
点赞
收藏
分享

微信扫一扫

剑指offer(c++版本) (4)重建二叉树(可直接运行)

敬亭阁主 2022-01-17 阅读 68

目录

前言

一、题目

二、程序

1.头文件

2.类和主函数


前言

本人刷剑指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;
}
举报

相关推荐

0 条评论