难度中等
给定一棵树的前序遍历 preorder
与中序遍历 inorder
。请构造二叉树并返回其根节点。
示例 1:
Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7] Output: [3,9,20,null,null,15,7]
注释写满了心路历程,应该算比较详细?
class Solution {
public:
TreeNode* bulidTreePoint(vector<int> &preorder,int preL,int preR,vector<int> &inorder,int inoL,int inoR){//preL~preR固定为某树的前序遍历,inoL~inoR固定为某树的中序遍历
if(preL>preR||inoL>inoR){
return nullptr;
}
int rootval=preorder[preL];
int midd=find(inorder.begin(),inorder.end(),rootval)-inorder.begin();//midd的序号代表了什么?(1)根节点的序号(2)左子树结点数量=序号(在0开头的时候)
TreeNode* s=new TreeNode(rootval);
s->left=bulidTreePoint(preorder,preL+1,preL+midd-inoL,inorder,inoL,midd-1);//这里的inoL意味着什么?或者说midd-inoL意味着左子树结点数!inoL是左子树的开头,midd是根节点的位置,已知中序遍历的结构为[[left]root[right]],根节点的序号和整个中序遍历头的序号中间的数量就是左子树结点数;
s->right=bulidTreePoint(preorder,preL+midd-inoL+1,preR,inorder,midd+1,inoR);
return s;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
return bulidTreePoint(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size() - 1);
}
};