Open bosthhe1 opened 1 year ago
TreeNode* _buildTree(int &root,int left,int right,vector<int>& preorder, vector<int>& inorder)
{
if(left>right)
return nullptr;
int rooti = left;
TreeNode* Node = new TreeNode(preorder[root]);
while(preorder[root]!=inorder[rooti]&&rooti<right)
{
rooti++;//rooti将区间分为[left,rooti-1],rooti,[rooti+1,right];
}
++root;//前序顺序是一定的,只需要一直++;
Node->left = _buildTree(root,left,rooti-1,preorder, inorder);//调整插入的位置
Node->right = _buildTree(root,rooti+1,right,preorder, inorder);
return Node;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int root = 0;//前序的跟节点为0
int left = 0;
int right = preorder.size()-1;
return _buildTree(root,left,right,preorder, inorder);
}
这种我们的思想是,利用前序确认节点,利用中序确定范围,因为前序是一定的,是按照顺序的,这个东西说起来比较抽象,中序其实就是拿来区分左右期间和确认返回值的,这个中序区间和归并排序有一些相似,我们用前序为例子,因为前序是先跟再左子树右子树,所以前序遍历我们一定知道跟节点的位置,中序就区分左右子树,因为前序总是按照顺序走的(就是先构建左,后构建右),所以只需要确认返回条件就能构建树,只要没有遇到返回条件,就一直构建下去,遇到返回条件就return回来,链接上