题目大意:根据所给的前序和中序遍历的二叉树序列构建出二叉树
分析:dfs。由于前序遍历时的第一个结点就是根节点,在中序遍历的序列中位于根节点左侧的就是左子树,右侧的就是右子树,所以可以递归建树
代码:
/**
* 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 *buildTree(vector<int> &preorder, vector<int> &inorder) {
return Helper(preorder, 0, preorder.size()-1, inorder, 0, inorder.size()-1);
}
TreeNode* Helper(vector<int> &preorder, int begin1, int end1, vector<int> &inorder, int begin2, int end2) {
if(begin1 > end1)
return NULL;
else if(begin1 == end1)
return new TreeNode(preorder[begin1]);
TreeNode* root = new TreeNode(preorder[begin1]);
int i;
for(i = begin2; i <= end2; i ++) { //在中序序列中找到根节点的索引i
if(inorder[i] == preorder[begin1])
break;
}
int leftlen = i-begin2; //中序序列左侧的结点个数(左子树节点个数)
root->left = Helper(preorder, begin1+1, begin1+leftlen, inorder, begin2, i - 1);
root->right = Helper(preorder, begin1+leftlen+1, end1, inorder, i + 1, end2);
return root;
}
};