이원 탐색 트 리 를 정렬 된 양 방향 링크 로 바 꾸 는 알고리즘 사고
2049 단어 알고리즘 문제 해석
처음에 이 문 제 를 보고 생각 이 복잡 하 다 고 생각 한 후에 반성 하기 시작 했다.
1. 이것 은 나무 에 관 한 문제 입 니 다. 일반적으로 재 귀 알고리즘 과 나무의 역 사 를 검사 합 니 다.
2. 이것 은 이원 에서 나 무 를 찾 는 것 입 니 다. 그러면 어 릴 때 부터 큰 순 서 는 나무의 앞 순 서 를 목록 에 옮 겨 다 니 는 것 입 니 다. 다시 말 하면 문제 가 우리 에 게 결점 을 다시 만 들 수 있 도록 허락 한다 면 앞 순 서 를 통 해 차례대로 결점 을 만 들 면 자 연 스 럽 게 해결 할 수 있 습 니 다.
3. 그러나 제목 은 새로운 결점 을 만 들 수 없다. 다시 생각해 보면 결점 을 만 들 필요 가 없다. 앞 순 서 를 옮 겨 다 닐 때 우리 가 현재 결점 을 방문 할 때 앞의 결점 을 얻 을 수 있다 면 자 연 스 럽 게 연결 할 수 있다.
이 사고방식 이 형 성 된 후에 다음 과 같은 코드 가 형성 되 었 다.
/* , */
BSTreeNoe * changeTreeToLinkList ( BSTreeNode *Tree ) {
BSTreeNode *former=NULL, *head=Tree;
if ( ! Tree) return NULL;
InOrderTraverse ( Tree, former );
while ( head->m_pLeft != NULL ) head=head->m_pLeft;
return head;
}
/* */
void InOrderTraverse ( BSTreeNode *Tree, BSTreeNode * &former) {
if ( Tree->m_pLeft ) InOrderTraverse ( Tree->m_pLeft, former );
visit ( Tree, former );
if ( Tree->m_pRight) InOrderTraverse ( Tree->m_pRight, former );
}
/* , former , */
void visit ( BSTreeNode *Tree, BSTreeNode * &former) {
if ( former==NULL ) {
former=Tree;
}else{
former->m_pRight=Tree;
Tree->m_pLeft=former;
former=Tree;
}
}
이렇게 해서 첫 번 째 해법 이 형성 되 었 다.이어서 두 번 째 해법 이 있 는 지 생각 하기 시작 했다.이것 은 나무 에 관 한 문제 로 일반적으로 규칙 을 찾 아 나무 결점 과 좌우 자수의 각도 에서 생각해 야 한다.
1. 결점 A 에 왼쪽 나무 가 있다 면 A 의 앞 구 조 는 왼쪽 나무의 가장 큰 결점 이 고 A 나무의 가장 작은 결점 은 왼쪽 나무의 가장 작은 결점 이다.2. 만약 에 결점 A 가 왼쪽 나무 가 없다 면 A 는 반드시 특정한 결점 의 선구자 일 것 이다.그리고 A 나무의 가장 작은 결점 은 A 이다.3. 만약 에 결점 A 에 오른쪽 나무 가 있다 면 A 의 후계 점 은 오른쪽 나무의 가장 작은 결점 이 고 A 나무의 가장 큰 결점 은 오른쪽 나무의 가장 큰 결점 이다.4. 만약 에 결점 A 가 오른쪽 나무 가 없다 면 A 는 반드시 특정한 결점 의 후계 이 고 A 나무의 가장 큰 결점 은 A 이다.이해 하기 에는 스트레스 가 많 습 니 다........................................................................................