解题思路:
自己画一颗二叉树,把它的 先序遍历和 中序遍历写出来,然后可以发现规律。
1,preorder的第一个元素a,是root的val;
2,在inorder中找到a,则a左边的元素都在root的左子树上,inorder中a右边的元素都在root的右子树上;
3,inorder中a左边的元素,紧接着出现在 preorder中a的后面并且连续,利用这个规律,可以 分治了
4,我觉得看代码的时候,配合画一下图,比较容易理解
/**
* 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) {
TreeNode* root = NULL;
build(root, preorder, 0, preorder.size(), inorder, 0, inorder.size());
return root;
}
void build(TreeNode* &root, vector<int>& preorder, int preLeft, int preRight,
vector<int>& inorder, int inLeft, int inRight){
if (preLeft == preRight) return;
int nodeVal = preorder[preLeft];
root = new TreeNode(nodeVal);
auto result = find(inorder.begin()+inLeft, inorder.begin()+inRight, nodeVal);
int premid = 0;
int inmid = 0;
if (result != inorder.end()){
inmid = result - inorder.begin();
premid = (inmid - inLeft) + preLeft;
build(root->left, preorder, preLeft+1, premid+1, inorder, inLeft, inmid);
build(root->right, preorder, premid+1, preRight, inorder, inmid+1, inRight);
}else{
printf("cannot find preorder val in inorder list");
}
return;
}
};