먼저 훑어본 결과에 따라 두 갈래 검색 트리 복원
My Code
#include
#include
#include
#include
#include
using namespace std;
const int maxn = 1009;
int pre[maxn]; //preorder
int mid[maxn]; //indorder
map<int,int> index; //index of value maxn in mid[]
//define the node of tree
struct Node{
int val;
Node *ls, *rs;
Node(){ ls = rs = NULL, val = -1; }
};
//use recursino to rebuild an binary find tree
//lr and rr mean the index of node in mid[] that it node cover by indirectly
//pi mean the index of value in pre[] that node n's value should be set
void build(Node *&n,int pi, int lr, int rr){
if(n==NULL) n = new Node();
int v = pre[pi];
n->val =v;
//cout << v << endl;
if (rr - lr < 1) return; //prove that it node is leaf
int mi = index[v];
if (mid[mi + 1] == mid[mi]) index[v]++;
if (mi - lr > 0){ //then it node have left son
build(n->ls, pi + 1, lr, mi - 1); //left son value is just in the right of it node in pre[]
}
if (rr - mi > 0){ //it node have right son
int dis = mi - lr + 1; //the distant of index between it node and right son in pre[]
build(n->rs, pi+dis, mi + 1, rr);
}
}
int main(){
int n;
//get input data
cin >> n;
for (int i = 0; i < n; i++){
scanf("%d", &pre[i]);
mid[i] = pre[i];
}
//handle the data
sort(mid, mid + n);
for (int i = n - 1; i >= 0; i--){
index[mid[i]] = i; //recorde the index of value that appare in first times
}
//rebuild binary search tree by the data we have
Node *head = NULL;
build(head, 0, 0, n-1);//not include n !
}
비고 방법은 틀림없을 것이다. 모두 규칙이다. 그러나 문제를 풀 때 이 방법으로 두 갈래 나무를 복원할 때 뜻밖에도 일반적인 데이터가 시간을 초과했다. 귀찮아.당분간 시간 초과 원인을 찾지 못했습니다...
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
두 갈래 나무의 깊이가 두루 다니다텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.