이 문제에서는 이진 트리가 제공됩니다. 우리의 임무는 이진 트리의 최소 깊이를 찾는 것입니다.
Binary Tree는 각 노드가 최대 2개의 자식을 가질 수 있는 특별한 조건이 있습니다.
바이너리 트리의 최소 깊이는 루트 노드와 모든 리프 노드 사이의 최단 경로입니다.
문제를 이해하기 위해 예를 들어보겠습니다.
입력
출력
2
솔루션 접근 방식
문제에 대한 해결책은 이진 트리를 탐색하고 높이를 계산하는 것입니다. 이는 노드가 아닌 각 노드에 대해 노드의 자식 노드를 재귀적으로 호출하고 각 리프 노드에 대해 1을 반환하여 수행할 수 있습니다.
우리 솔루션의 작동을 설명하는 프로그램
예시
#include<bits/stdc++.h> using namespace std; struct Node { int data; struct Node* left, *right; }; int findMinDepthBT(Node *currentNode) { if (currentNode == NULL) return 0; if (currentNode->left == NULL && currentNode->right == NULL) return 1; if (!currentNode->left) return findMinDepthBT(currentNode->right) + 1; if (!currentNode->right) return findMinDepthBT(currentNode->left) + 1; return min(findMinDepthBT(currentNode->left), findMinDepthBT(currentNode->right)) + 1; } Node *newNode(int data) { Node *temp = new Node; temp->data = data; temp->left = temp->right = NULL; return (temp); } int main() { Node *root = newNode(5); root->left = newNode(2); root->right = newNode(9); root->left->left = newNode(5); root->left->right = newNode(1); root->left->left->left = newNode(7); root->left->left->right = newNode(3); cout<<"The minimum depth of binary tree is "<<findMinDepthBT(root); return 0; }
출력
The minimum depth of binary tree is 2
이 접근 방식은 매우 효율적이지만 다른 탐색 기술을 사용하여 최소 깊이를 더 효과적으로 찾을 수 있습니다.
그러한 접근법 중 하나는 레벨별로 트리 레벨을 순회하는 레벨 순서 순회를 사용하는 것입니다. 그리고 첫 번째 리프 노드를 만나는 레벨 번호를 반환합니다.
우리 솔루션의 작동을 설명하는 프로그램
예시
#include<bits/stdc++.h> using namespace std; struct Node { int data; struct Node *left, *right; }; struct lOrderQueue { Node *node; int depth; }; int findMinDepthBT(Node *root) { if (root == NULL) return 0; queue<lOrderQueue> levelOrder; lOrderQueue deQueue = {root, 1}; levelOrder.push(deQueue); while (levelOrder.empty() == false) { deQueue = levelOrder.front(); levelOrder.pop(); Node *node = deQueue.node; int depth = deQueue.depth; if (node->left == NULL && node->right == NULL) return depth; if (node->left != NULL) { deQueue.node = node->left; deQueue.depth = depth + 1; levelOrder.push(deQueue); } if (node->right != NULL) { deQueue.node = node->right; deQueue.depth = depth+1; levelOrder.push(deQueue); } } return 0; } Node* newNode(int data) { Node *temp = new Node; temp->data = data; temp->left = temp->right = NULL; return temp; } int main() { Node *root = newNode(5); root->left = newNode(2); root->right = newNode(9); root->left->left = newNode(5); root->left->right = newNode(1); root->left->left->left = newNode(7); root->left->left->right = newNode(3); cout<<"The minimum depth of binary tree is "<<findMinDepthBT(root); return 0; }
출력
The minimum depth of binary tree is 2