ในปัญหานี้ เราได้รับไบนารีทรี งานของเราคือค้นหาความลึกขั้นต่ำของต้นไม้ไบนารี
Binary Tree มีเงื่อนไขพิเศษที่แต่ละโหนดสามารถมีลูกได้สูงสุดสองคน
ความลึกขั้นต่ำของไบนารีทรีคือเส้นทางที่สั้นที่สุดระหว่างโหนดรูทไปยังโหนดปลายสุดใดๆ
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
อินพุต

ผลลัพธ์
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