剑指 Offer 07. 重建二叉树
剑指 Offer 07. 重建二叉树
递归1
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder)
{
if(preorder.size()==0)
return NULL;
if(preorder.size()==1)
{
TreeNode* root=new TreeNode(preorder[0]);
return root;
}
TreeNode* root=new TreeNode(preorder[0]);
int index;
for(int i=0;i<inorder.size();i++)
{
if(inorder[i]==preorder[0])
{
index=i;
break;
}
}
vector<int> leftPre(preorder.begin()+1,preorder.begin()+1+index);
vector<int> leftIn(inorder.begin(),inorder.begin()+index);
vector<int> rightPre(preorder.begin()+1+index,preorder.end());
vector<int> rightIn(inorder.begin()+index+1,inorder.end());
root->left=buildTree(leftPre,leftIn);
root->right=buildTree(rightPre,rightIn);
return root;
}
};
改进:递归2
不直接输入vector进行递归,而是通过索引进行递归
class Solution {
public:
map<int,int> dic;
vector<int> preOrder;
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder)
{
for(int i=0;i<inorder.size();i++)
{
dic[inorder[i]]=i;
}
for(int i=0;i<preorder.size();i++)
{
preOrder.push_back(preorder[i]);
}
return recur(0,0,inorder.size()-1);
}
TreeNode* recur(int pre_root,int in_left,int in_right)
{
if(in_left>in_right)
return NULL;
TreeNode* root= new TreeNode(preOrder[pre_root]);
int index=dic[preOrder[pre_root]];
root->left=recur(pre_root+1,in_left,index-1);
root->right=recur(pre_root+1+index-in_left,1+index,in_right);
return root;
}
};