【题目】
Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
【题意】
给定先序和中序遍历,构造二叉树。
题目保证所给的序列中不存在重复值
【思路】
【代码】
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int getPosOfRoot(vector<int>&inorder, int istart, int iend, int key){
for(int i=istart; i<=iend; i++){
if(inorder[i]==key)return i;
}
}
TreeNode *build(vector<int>&preorder, int pstart, int pend, vector<int>&inorder, int istart, int iend){
if(pstart>pend)return NULL;
// 创建根节点
TreeNode*root = (TreeNode*)malloc(sizeof(TreeNode));
root->val=preorder[pstart];
//确定根节点在中序遍历中的位置
int rootPos = getPosOfRoot(inorder, istart, iend, preorder[pstart]);
//左子树中序遍历序列的长度
int lenLeft = rootPos-istart;
//右子树中序遍历序列的长度
int lenRight = iend-rootPos;
//创建左子树
TreeNode* left=build(preorder, pstart+1, pstart+lenLeft, inorder, istart, rootPos-1);
//创建右子树
TreeNode* right=build(preorder, pstart+lenLeft+1, pend, inorder, rootPos+1, iend);
//构造二叉树
root->left=left;
root->right=right;
return root;
}
TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
int size=preorder.size();
if(size==0)return NULL;
return build(preorder, 0, size-1, inorder, 0, size-1);
}
};