전서와 후서는 언제 나무 한 그루를 확정할 수 있습니까?

1684 단어 PAT-AL
일반적인 상황에서 이미 알려진 두 갈래 나무의 전차와 후차는 유일하게 두 갈래 나무를 확정할 수 없다. 왜냐하면 여러 가지 상황이 존재할 수 있기 때문이다. 즉, 결점이 뿌리일 수도 있고 왼쪽 아이일 수도 있고 뿌리의 오른쪽 아이일 수도 있기 때문이다.앞 순서의 시작은 첫 번째와 뒤 순서의 마지막이 같다. 이 결점은 바로 뿌리 결점이다. 다음 순서의 뿌리 결점의 앞 결점은 참고로 이 결점이 앞 순서에 있는 위치를 찾아라. 만약에 이 위치의 앞 위치의 노드가 지난 순서의 첫 번째 시작 노드가 아니라면 부분은 유일하다.귀속이 진행될 때, 귀속이 끝날 때까지 상술한 조건이 계속 성립된다면, 이 나무는 유일하게 확정된다.반대로 유일하지 않다.
참조 소스
//1119. Pre - and Post - order Traversals(30)
#include   
#include   
using namespace std;
vector ans;
int *pre, *post, unique = 1;

int findFromPre(int x, int l, int r) {
	for (int i = l; i <= r; i++) {
		if (x == pre[i]) {
			return i;
		}
	}
	return -1;
}

void setIn(int prel, int prer, int postl, int postr) {
	if (prel == prer) {
		ans.push_back(pre[prel]);
		return;
	}
	if (pre[prel] == post[postr]) {
		int x = findFromPre(post[postr - 1], prel + 1, prer);
		if (x - prel > 1) {
			setIn(prel + 1, x - 1, postl, postl + x - prel - 2);
			ans.push_back(post[postr]);
			setIn(x, prer, postl + x - prel - 2 + 1, postr - 1);
		}
		else {
			unique = 0;
			ans.push_back(post[postr]);
			setIn(x, prer, postl + x - prel - 2 + 1, postr - 1);
		}
	}
}

int main() {
	int n = 0;
	scanf("%d", &n);
	pre = new int[n];
	post = new int[n];
	for (int i = 0; i < n; i++) {
		scanf("%d", &pre[i]);
	}
	for (int i = 0; i < n; i++) {
		scanf("%d", &post[i]);
	}
	setIn(0, n - 1, 0, n - 1);
	printf("%s
", unique ? "Yes" : "No"); printf("%d", ans[0]); for (int i = 1; i < ans.size(); i++) { printf(" %d", ans[i]); } printf("
"); return 0; }

좋은 웹페이지 즐겨찾기