题目链接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/
- 首先,要明白preorder和inorder的关系,preorder中的第一个往往是那颗(子)树的根节点,在inorder中就可以把序列分为左右两半(左树、右树)。
- 这里选择前序遍历构造树:也就是先构造根节点,再构造左子树和右子树。
- 如何构造:首先我们知道preorder的第一个就是根节点,而不知道下一个结点究竟是左子树还是右子树,这个时候我们就要根据inorder来划分,preorder中的那个根节点root所在inorder中的位置cur,cur左边(
[left,cur-1]
)就是其左子树,cur右边([cur+1,right]
)就是其右子树。
class Solution {
public:
int pos = -1;
vector<int> preorder,inorder;
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
this->preorder = preorder;
this->inorder = inorder;
int n = preorder.size() - 1;
return rebuild(0,n);
}
TreeNode* rebuild(int left,int right){
if(left > right) return NULL;
//前序遍历式构造
TreeNode* root = new TreeNode(preorder[++pos]);
//root->left->right
int mid = 0;
while(inorder[mid] != root->val) ++mid;
root->left = rebuild(left,mid-1);
root->right = rebuild(mid+1,right);
return root;
}
};