重建二叉树

来源:互联网 发布:车辆识别摄像头软件 编辑:程序博客网 时间:2024/05/07 14:40

题目描述

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

#include <iostream>#include <vector>using namespace std;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()){            return NULL;        }        TreeNode* head = new TreeNode(pre[0]);        //找到根结点在中序遍历中的序号,将树分为左右两部分        int index = 0;        for (int i = 0; i<vin.size(); i++){            if (vin[i] == pre[0]){                index = i;                break;            }        }        vector<int> left_pre, left_vin, right_pre, right_vin;        for (int i = 1; i<pre.size(); i++){            if (i<index + 1)                left_pre.push_back(pre[i]);            else                right_pre.push_back(pre[i]);        }        for (int i = 0; i<vin.size(); i++){            if (i<index)                left_vin.push_back(vin[i]);            if (i>index)                right_vin.push_back(vin[i]);        }        head->left = reConstructBinaryTree(left_pre, left_vin);        head->right = reConstructBinaryTree(right_pre, right_vin);        return head;    }};int main(){    int pre[] = { 1, 2, 4, 7, 3, 5, 6, 8 };    int in[] = { 4, 7, 2, 1, 5, 3, 8, 6 };    vector<int> vpre(pre, pre + 8);    vector<int> vin(in, in + 8);    Solution solution;    TreeNode* tree = solution.reConstructBinaryTree(vpre, vin);    return 0;}
0 0
原创粉丝点击