ในบทช่วยสอนนี้ เราจะค้นหาโหนดลีฟที่ลึกที่สุดในไบนารีทรี มาดูไบนารีทรีกัน
A B C D E F G
มาดูขั้นตอนการแก้ปัญหากัน
-
เขียน Node struct ด้วย char, left และ right pointers
-
เริ่มต้นไบนารีทรีด้วยข้อมูลจำลอง
-
เขียนฟังก์ชันแบบเรียกซ้ำเพื่อค้นหาโหนดด้านซ้ายที่ลึกที่สุดในฟังก์ชันไบนารี ต้องใช้โหนดรูทอาร์กิวเมนต์สามโหนด isLeftNode และตัวชี้ผลลัพธ์เพื่อเก็บโหนดที่ลึกที่สุด
-
หากโหนดปัจจุบันเหลืออยู่และเป็นโหนดปลายสุด ให้อัปเดตโหนดผลลัพธ์ด้วยโหนดปัจจุบัน
-
เรียกฟังก์ชันแบบเรียกซ้ำบนทรีย่อยด้านซ้าย
-
เรียกฟังก์ชันแบบเรียกซ้ำบนแผนผังย่อยด้านขวา
-
หากโหนดผลลัพธ์เป็นโมฆะ แสดงว่าไม่มีโหนดใดที่ตรงตามเงื่อนไขของเรา
-
หรือพิมพ์ข้อมูลในโหนดผลลัพธ์
ตัวอย่าง
มาดูโค้ดกันเลย
#include <bits/stdc++.h>
using namespace std;
struct Node {
char data;
struct Node *left, *right;
};
Node *addNewNode(char data) {
Node *newNode = new Node;
newNode->data = data;
newNode->left = newNode->right = NULL;
return newNode;
}
void getDeepestLeftLeafNode(Node *root, bool isLeftNode, Node **resultPointer) {
if (root == NULL) {
return;
}
if (isLeftNode && !root->left && !root->right) {
*resultPointer = root;
return;
}
getDeepestLeftLeafNode(root->left, true, resultPointer);
getDeepestLeftLeafNode(root->right, false, resultPointer);
}
int main() {
Node* root = addNewNode('A');
root->left = addNewNode('B');
root->right = addNewNode('C');
root->left->left = addNewNode('D');
root->right->left = addNewNode('E');
root->right->right = addNewNode('F');
root->right->left->right = addNewNode('G');
Node *result = NULL;
getDeepestLeftLeafNode(root, false, &result);
if (result) {
cout << "The deepest left child is " << result->data << endl;
}
else {
cout << "There is no left leaf in the given tree" << endl;
}
return 0;
} ผลลัพธ์
หากคุณรันโปรแกรมข้างต้น คุณจะได้ผลลัพธ์ดังต่อไปนี้
The deepest left child is D
บทสรุป
หากคุณมีข้อสงสัยใดๆ ในบทแนะนำ โปรดระบุในส่วนความคิดเห็น