版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}