重建二叉树

对着背影说爱祢 提交于 2020-01-28 05:07:09

题目:重建二叉树

题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

思路

前序遍历:中左右

中序遍历:左中右

根据pre[0]=vin[i]找出根(mid)的位置,递归左右子树

#include<iostream>
#include<vector>
#include<queue>
#include<stack>
using namespace std;
struct TreeNode{
	int val;
	TreeNode *left;
	TreeNode *right;
	TreeNode(int x):
		val(x), left(NULL), right(NULL){
		}
};
class Solution{
	public:
		// 思路:递归左右子树,找出左右的pre和vin 
		TreeNode *reConstructBinaryTree(vector<int> pre, vector<int> vin){
			int mid, size=pre.size();
			if(size==0) return NULL;
			TreeNode *root = new TreeNode(pre[0]);
			// 找mid的位置 
			for(int i=0;i<size;i++){
				if(pre[0]==vin[i]){
					mid=i;break;
				}
			} 
			
			// 定义l_pre,l_vin,r_pre,r_vin;
			vector<int> l_pre,l_vin,r_pre,r_vin;
			for(int i=0;i<mid;i++){
				l_pre.push_back(pre[i+1]);
				l_vin.push_back(vin[i]);
			}
			for(int i=mid+1;i<size;i++){
				r_pre.push_back(pre[i]);
				r_vin.push_back(vin[i]);
			}
			//递归找出左右子树
			root->left = reConstructBinaryTree(l_pre, l_vin);
			root->right = reConstructBinaryTree(r_pre, r_vin);
			return root;
		}
};

//根据建的树,进行层次遍历和后序遍历,检验结果。
vector<int> leaveTraversal(TreeNode *root){
	vector<int> res;
	if(root == NULL) return res;
	TreeNode *now = root;
	queue<TreeNode *> q;
	q.push(now);
	while(!q.empty()){
		now = q.front();
		res.push_back(now->val);
		q.pop();
		if(now->left!=NULL)
		q.push(now->left);
		if(now->right!=NULL)
		q.push(now->right); 
	}
	cout<<"层次遍历:";
	for(int i=0;i<res.size();i++)
		cout<<res[i]<<" ";
	cout<<endl;
	return res;
}
void postorderTraversal(TreeNode *root){
	//递归 
	if(root!=NULL){
		postorderTraversal(root->left);
		postorderTraversal(root->right);
		cout<<root->val<<" ";
	}	
}
int main(){
	vector<int>p={1,2,4,7,3,5,6,8}, v={4,7,2,1,5,3,8,6};
	Solution s;
	TreeNode *r = s.reConstructBinaryTree(p,v);
	leaveTraversal(r);
	postorderTraversal(r);
	return 0;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!