题目:
输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
思路:
思路比较直白,由前序遍历可得根节点,然后由中序遍历得左右子树。左右子树重复这个过程。即递归。
代码:
/**
* 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:
//找到目标数的下标
int helpIndex(vector<int>& nums,int start,int end,int target) {
int n = nums.size();
for(int i = start;i <= end;i++) {
if(nums[i] == target) {
return i;
}
}
return 0;
}
//递归函数,重建二叉树
TreeNode* helper(vector<int>& pre,int start,int end,vector<int>& vin,int startvin,int endvin){
if(start > end || startvin > endvin) return nullptr;
TreeNode* root = new TreeNode(pre[start]);
//递归出口,叶子结点
if(start == end) {
return root;
}
//找出根节点所在位置
int mid = helpIndex(vin,startvin,endvin,pre[start]);
//重建左子树
root->left = helper(pre, start+1, start+(mid-startvin), vin, startvin, mid - 1);
//重建右子树
root->right = helper(pre, start+(mid-startvin)+1, end, vin, mid+1, endvin);
return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if(preorder.empty()) return nullptr;
int n = preorder.size();
return helper(preorder, 0, n-1, inorder, 0, n-1);
}
};