[NK]重建二叉树

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

#include "stdafx.h"
#include<iostream>
using namespace std;
#include<vector>
/*
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
*/

//Definition for binary tree
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) {
        vector<int>::iterator itpre = pre.begin();
        vector<int>::iterator itvin = vin.begin();
        vector<int> lpre;
        vector<int> rpre;
        vector<int> lvin;
        vector<int> rvin;

        TreeNode *tn;


        tn = new TreeNode(pre[0]);    //初始化根节点


        while (*itvin != *itpre)   //找到中序遍历列表中的根节点
        {
            lvin.push_back(*itvin);   //左子树中序遍历列表
            itvin++;

        }

        if (*itvin == *itpre)    //找到中序遍历中的根节点
        {
            while (++itvin!=vin.end())
            {
                rvin.push_back(*itvin);     //右子树中序遍历列表
            }
            pre.erase(pre.begin());
            itvin = lvin.begin();

            int lvincount = lvin.size();
            int rvincount = rvin.size();
            itpre = pre.begin();
            while (lvincount--)
            {
                lpre.push_back(*itpre++);    //获取左子树前序遍历列表
            }
            while (rvincount--)
            {
                rpre.push_back(*itpre++);    //获取右子树前序遍历列表
            }
            if (!lpre.empty() && !lvin.empty())
            {
                tn->left = reConstructBinaryTree(lpre, lvin);     //构建左子树
            }

            if (!rpre.empty() && !rvin.empty())
            {
                tn->right = reConstructBinaryTree(rpre, rvin);     //构建右子树
            }

        }

        return tn;
    }
};

int main()
{
    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 *tn;
    tn = s.reConstructBinaryTree(pre, vin);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/u014630431/article/details/81062922