前言:
牛客网 c++ 剑指Offer_编程题 第四题重建二叉树
题目:
这个题要比前3题要难点了,解题思路根据先序和中序的特性 先找根节点 找左子树和右子树,递归找
先序的第一个 肯定是根节点,那么去中序里找根节点的位置,前面的都是左子树,后面的就是右子树
code:
/**
* 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) {
if (vin.size() == 0 || pre.size() == 0)
return nullptr;
//先序的头肯定是根节点
TreeNode* root=new TreeNode(pre[0]);
//找左子树和右子树
vector<int> preLeft_;
vector<int> preRight_;
vector<int> vinLeft_;
vector<int> vinRight_;
//root 在中序的位置
int rootInIndex = -1;
for (auto i = 0; i < vin.size(); i++)
{
if (vin[i] == root->val)
rootInIndex = i;
}
//中序中 root前面的都是左子树
for (auto i = 0; i < rootInIndex; i++)
{
vinLeft_.push_back(vin.at(i));
//pre 第一个是根节点
preLeft_.push_back(pre.at(i + 1));
}
for(auto i = rootInIndex+1;i<vin.size();i++)
{
vinRight_.push_back(vin.at(i));
preRight_.push_back(pre.at(i));
}
root->left = reConstructBinaryTree(preLeft_, vinLeft_);
root->right = reConstructBinaryTree(preRight_, vinRight_);
return root;
}
};