题目链接
思路分析
众所周知,我们知道一个二叉树的前序遍历和中序遍历 或者中序遍历和后序遍历,我们就可以通过这两组数对二叉树进行复现
- 首先,要明确,我们先序遍历数组的第一个数就是我们根节点
- 我们根据根节点找到终须数组的分界点,将中序数组分为左右字数两部分
- 我们此时要对前序数组进行切分,我们对前序数组切分的大小就是我们中序遍历切分的两个数组的大小
- 因为我们要满足中序子数组和前序子数组大小是相同的,这样才能保证其可以进行重建
代码实现
/**
* 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* reBuildTree(vector<int>& preorder, int begin, int end, vector<int>& inorder, int left, int right)
{
if(begin > end)
return NULL;
int val = preorder[begin];
TreeNode* root = new TreeNode(val);
if(left == right)
return root;
//按照val对inorder进行切割
int mid = 0;
for(int i = left; i <= right; ++i)
{
if(inorder[i] == val)
{
mid = i;
break;
}
}
root->left = reBuildTree(preorder, begin+1, begin+(mid - left), inorder, left, mid-1);
root->right = reBuildTree(preorder, begin+(mid-left)+1, end, inorder, mid+1, right);
return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
//前序遍历的都一个节点就是二叉树的根节点,根据这个节点将中序遍历分开
return reBuildTree(preorder, 0, preorder.size()-1, inorder, 0, inorder.size()-1);
}
};