이송 이진 트리는 트리의 시퀀스 전순 주사에 따라 구성된다.
참고 :
당신은 트리 요소를 복제하지 않는 것을 가정 할 수있다.
예를 들어, 주어진
전순 주사의 전순 = [3,9,20,15,7]
예약 주문 [9,3,15,20,7] inorder를 =
다음 이진 트리를 반환합니다 :
3
/ 9~20
/ 15 (7)
출처 : 버튼 (LeetCode) 유지
: 링크 https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal
아이디어 : 전순 주사 뿌리에 관한 것입니다, 예약 주문은 남아 재귀 각 좁은 루트를 찾기 위해 각 루트 노드가 내부를 가로 지르는 사전 주문에서 발견 오른쪽, 다음 단계 (
class Solution {
public:
unordered_map<int,int> pos;//目的是快速找到一个值在inorder内的下标
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int n=preorder.size();
for(int i=0;i<n;++i){
pos[inorder[i]]=i;
}
return dfs(preorder,inorder,0,n-1,0,n-1);
}
TreeNode* dfs(vector<int>& pre,vector<int>& in,int pl,int pr,int il,int ir){
if(pl>pr)return NULL;//进行到找不到结点的时候就返回
int len=pos[pre[pl]]-il;
auto root = new TreeNode(pre[pl]);
root->left=dfs(pre,in,pl+1,pl+len,il,il+len-1);
root->right=dfs(pre,in,pl+len+1,pr,il+len+1,ir);
return root;
}
};