문제가 해결 될 수 있습니다 :
1. 문제가 날 귀찮게되어, 사람들은 다음을 참조 입력 트리를 처리하는 방법이다 싶어,이 계층 구조가 명확하고 직관적 인 방법입니다 통과하는 것이 가장 좋습니다.
포인터의 사용에 대하여 2 *
따라서, 코드 리드가 완료되지 않는 경우, 주요 기능은 솔루션의 클래스를 호출하지가
각 노드 II에서 117 채우기 다음 자리 포인터
매질
이진 트리 감안할 때
구조체 노드 { INT 발; 노드 * 왼쪽; 노드 * 권리; 다음 노드 *; }
그 바로 옆에 노드를 가리 키도록 다음의 각 포인터를 채 웁니다. 더 바로 옆에 노드가없는 경우, 다음 포인터로 설정해야합니다 NULL
.
처음에는 모두 다음 포인터로 설정됩니다 NULL
.
후속 :
- 당신은 일정한 여분의 공간을 사용할 수 있습니다.
- 재귀 접근 방식은이 문제에 대한 여분의 공간으로 간주하지 않습니다 암시 스택 공간을 가정 할 수있다, 괜찮습니다.
예 1 :
INPUT : 루트 = 1,2,3,4,5, 널 ,. 7] 출력 :. 1, # 3, #, 4,5,7, #] 설명 : 주어진 이진 트리 (그림 A 위에 ), 함수는 다음의 각 채워야 단지 그림 B에는 '#'각 레벨의 끝을 의미와 함께, 다음 포인터로 연결로 출력 레벨 순서에 연재에서처럼, 그 바로 옆에 노드를 가리 키도록 포인터를.
이 질문은 차이의 질문에 변형 :
트리의 특정 노드가 있는지 여부를 구분하지 않고 완전한 이진 트리에이 나무는 재귀, 비 재귀 두 종류 통과해야합니다. 재귀 방법은 다를 수 있지만, 비 재귀 방법
도 적용 할 수있다. 비 재귀 방법은 좋은 것, 그리고 결합 된 스택, 스택에 요소가있을 것, 그 자체가 가져 오는 나무의 영향을 무시했다. 이 방법은 공간이며
이중 순환이 있지만, 복잡성에 매우 잘 수행하지만, 사이클의 수는 적은 이유 것으로 추정된다 수행
#INCLUDE <. 비트 / stdc ++ H> / * 멀티 라인 주석 * / 사용 스페이스 성병; // 노드에 대한 정의. 클래스 노드 { 공개 : INT 발; 노드 *는 왼쪽; 노드 * 권리; 노드 * 다음; // 세 가지 다른 종류의 초기화 발 (: 노드 () 0 ), 왼쪽 (NULL), 오른쪽 (NULL), 다음 (NULL) {} 노드 ( INT _val) : 발 (_val), 왼쪽 (NULL)을, 오른쪽 (NULL ), 다음 (NULL) {} 노드 ( INT의 _val, 노드 * _Left, 노드 * _right, 노드 *_next) : 발 (_val), 왼쪽 (_Left), 오른쪽 (_right), 다음 (_next) {} }; // 솔루션의 정의 클래스 솔루션 { 공개 : 노드 * 연결 (노드 * 루트) { // 특별한 경우 거래 하는 경우 (루트!) 반환 NULL; // 라인별로 저장 큐에서 정의 대기열 <노드 *> Q 단계; q.push (루트); //이 여전히 노드를 반복하지 않은 동안 (! q.empty ()) { INT 렌 = q.size (); 대 ( INT I =0 ; 나는 <렌; ++ I) { 기지국 * t = q.front (); () q.pop; 경우 (I <len- 1 ) T-> 다음 = q.front (); 경우 (T->는 q.push을 (T-> 좌) 왼쪽); 경우 (T -> 우) q.push (T-> 오른쪽); } } 반환 루트; } };