剑指offer:重建二叉树(C++)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liuweiyuxiang/article/details/84771960

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

#include <iostream>
#include <stdlib.h>
#include <string>
#include <vector>
using namespace std;
/**
* Definition for binary tree
* struct TreeNode {
*     int val;
*     TreeNode *left;
*     TreeNode *right;
*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
struct TreeNode {
	int val;
	TreeNode *left;
	TreeNode *right;
	TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
	TreeNode* reConstructBinaryTree(vector<int> pre, vector<int> vin) {
		if (pre.size() == 0 || vin.size() == 0 || pre.size() != vin.size()){
			return NULL;
		}
		TreeNode * ptn = create(pre, vin);
		return ptn;
	}
	TreeNode* create(vector<int> pre, vector<int> vin){
		if (pre.size() == 0 || vin.size() == 0 || pre.size() != vin.size()){
			return NULL;
		}
		else{
			TreeNode * ptn = new TreeNode(pre[0]);
			int leftNum = 0;
			int rightNum = 0;
			int rootMid = rootIndex(pre[0], vin, leftNum, rightNum);
			vector<int> preLeft(pre.begin() + 1, pre.begin() + leftNum + 1);
			vector<int> preRight(pre.begin() + leftNum + 1, pre.end());
			vector<int> vinLeft(vin.begin(), vin.begin() + rootMid);
			vector<int> vinRight(vin.begin() + rootMid + 1, vin.end());
			ptn->left = create(preLeft, vinLeft);
			ptn->right = create(preRight, vinRight);
			return ptn;
		}
	}
	int rootIndex(int element, vector<int> v, int &leftNum, int &rightNum){
		int rootIndex = -1;
		for (int i = 0; i < v.size(); i++){
			if (element == v[i]){
				rootIndex = i;
				continue;
			}
			if (rootIndex == -1){
				leftNum++;
			}
			else{
				rightNum++;
			}		
		}
		return rootIndex;
	}
};
//前序遍历
void firstRoot(TreeNode* phead){
	if (phead != NULL){
		cout << phead->val << " ";
		firstRoot(phead->left);
		firstRoot(phead->right);
	}	
}
//中序遍历
void midRoot(TreeNode* phead){
	if (phead != NULL){
		midRoot(phead->left);
		cout << phead->val << " ";
		midRoot(phead->right);
	}
}
int main(void)
{
	//前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}
	vector<int> pre = { 1, 2, 4, 7, 3, 5, 6, 8 };
	vector<int> vin = { 4, 7, 2, 1, 5, 3, 8, 6 };
	Solution s;
	TreeNode* p = s.reConstructBinaryTree(pre,vin);
	firstRoot(p);
	cout << endl;
	midRoot(p);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/liuweiyuxiang/article/details/84771960