前言:
牛客網 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;
}
};