주어진 이진 트리의 최소 깊이를 추구하는 [자료 구조와 알고리즘]. 트리의 루트의 최소 깊이는 리프 노드의 가장 가까운 노드에 최단 경로의 수입니다.

문제 해결 아이디어 :

첫번째 생각에, 나무의 최소 깊이 +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); 
                } 
            } 
            깊이 ++; 
        } 
        깊이를 반환; 
    }

  

 

추천

출처www.cnblogs.com/zhengwangzw/p/11456700.html