문제 해결 아이디어 :
첫번째 생각에, 나무의 최소 깊이 +1 최소 깊이는 트리의 왼쪽과 오른쪽 서브 트리와 동일한 되돌아을 사용하는 것입니다;
이 개념에 따르면, 문제 해결 알고리즘을 쓰기
{해결 클래스 공개 공중 INT의 RUN (TreeNode를 루트) { TreeNode를 노드 = 루트, 현재 노드가 null 높이 0이면 // 재귀 경계 조건 IF (노드 == NULL) , 0을 반환 // 재귀 경계 조건 경우 현재 노드 . 리프 노드 (좌측 및 우측 서브 트리도 null), 높이가 1 (node.left == 널 && node.right == NULL) {IF . 창 1; } // 다른 노드가 현재 노드 값을 떠났다는 높이가된다 (현재의 Look 서브 트리이며 노드), 따라서 최대 높이 널 1+ 아니다 IF (node.left == 널 || node.right == NULL) { 반환 Math.max +. 1 (RUN (node.left) RUN (node.right)); } // 마지막으로, 약없는 빈 하위 트리의 최소 높이가 1 + Math.min +를 돌려 1 (RUN (node.left), RUN (node.right)). } }
또 다른 방법은 노드 큐 탐색을 저장해야하여, 위에서 아래로, 루트에서 시작하여, 비 재귀 탐색 순서 인,
코드 :
운전 INT {합니다 (TreeNode를 루트) 공공 IF (루트 == NULL) 반환 0; 큐 <TreeNode를> = 새 새 대기열 LinkedList의 <> (); Queue.offer (루트) INT 깊이 = 0; 트리의 // 현재 깊이 동안 {(queue.isEmpty ()!) INT 크기 = queue.size (); //이 장소이며, 현재 레이어를 점점 노드 수를 통과 할 필요는 (INT I = 0; 내가 크기 <; 내가 ++)에 대한 { TreeNode를 전류를 queue.poll = (); IF (current.left == 널 (null) && current.right == NULL) // 왼쪽과 오른쪽 서브 트리가 비어있는 경우 반환 1 + 깊이;. IF (! current.left = NULL) { Queue.offer (current.left) } IF (current.right = NULL!) { queue.offer (current.right); } } 깊이 ++; } 깊이를 반환; }