问题
根据一棵树的前序遍历与中序遍历构造二叉树。
示例
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
代码(c++)
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if(!preorder.size()) return NULL;
TreeNode* root=new TreeNode(preorder[0]);
int index=0;
stack<TreeNode*> data;
data.push(root);
for(int i=1;i<preorder.size();i++){
int value=preorder[i];
TreeNode* node=data.top();
if(node->val!=inorder[index]){
node->left=new TreeNode(value);
data.push( node->left);
}else{
while(!data.empty()&&data.top()->val==inorder[index]){
node=data.top();
data.pop();
index++;
}
node->right=new TreeNode(value);
data.push(node->right);
}
}
return root;
}
思路
参考思路:官方解答
附录:差不多的解答方式,但是代码有误
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
map<int,int> local;
int n=preorder.size();
map<int,pair<int,int>> result;
stack<int> flag;
flag.push(preorder[n-1]);
for(int i=0;i<n;i++){
local[inorder[i]]=i;
}
for(int i=0;i<n;i++){
if(flag.empty()) break;
int data=local[flag.top()];
int nowdata=local[preorder[i]];
if(data>nowdata){
flag.push(preorder[i]);
//是top的左子树
result[flag.top()].first=preorder[i];
}else{
int lastdata=flag.top();
while(data<nowdata){
lastdata=flag.top();
flag.pop();
if(flag.empty()) break;
data=local[flag.top()];
}
result[lastdata].second=preorder[i];
}
}
resultNum=result;
return is(preorder[0]);
}
TreeNode* is(int data){
TreeNode* treedata=new TreeNode;
treedata->val=data;
if(resultNum[data].first==0){
return treedata;
}else{
treedata->left=is(resultNum[data].first);
treedata->right=is(resultNum[data].second);
return treedata;
}
}
private:
map<int,pair<int,int>> resultNum;
};