一、题目
二、代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution
{
//核心:以前序为切割方法 切割中序数组 迭代
public:
TreeNode* recusion(vector<int>& preorder, vector<int>& inorder )
{
if(preorder.size()==0) return nullptr;
//先序遍历的第一个元素 就是当前的中间节点
int root_val = preorder[0];
TreeNode* root = new TreeNode(root_val);
//核心 找分割点 切割
if(preorder.size()==1) return root;
else
{
int cut_point;
for(cut_point=0; cut_point<inorder.size(); cut_point++)
{
if(inorder[cut_point] == root_val ) break;
}
vector<int> left_inorder(inorder.begin(), inorder.begin() + cut_point);
vector<int> right_inorder(inorder.begin() + cut_point + 1 ,inorder.end());
preorder.erase(preorder.begin());
vector<int> left_preorder(preorder.begin() , preorder.begin()+ left_inorder.size());
vector<int> right_preorder(preorder.begin()+ left_inorder.size(),preorder.end());
root->left = recusion(left_preorder, left_inorder);
root->right = recusion(right_preorder, right_inorder);
return root;
}
return nullptr;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder)
{
if(inorder.size() == 0||preorder.size() == 0) return nullptr;
return recusion(preorder,inorder);
}
};