เพื่อแก้ปัญหาที่เราได้รับไบนารีทรี ตอนนี้เราต้องหาเส้นทางที่มีจำนวนโค้งสูงสุด กล่าวคือ ทางโค้งจะพิจารณาเมื่อทิศทางของเส้นทางเปลี่ยนจากซ้ายไปขวาหรือกลับกัน เป็นต้น
อินพุต -
เอาท์พุต -
6
ในแนวทางนี้ เราจะสำรวจต้นไม้และติดตามการเคลื่อนไหวก่อนหน้า หากทิศทางเปลี่ยนไป เราก็แค่อัปเดตจำนวนโค้ง แล้วหาค่าสูงสุด
แนวทางในการหาแนวทางแก้ไข
ในแนวทางนี้ เราจะสำรวจเส้นทางทั้งหมด และพบจำนวนโค้งสูงสุดที่เราอัปเดตคำตอบของเรา
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; struct Node { // structure of our node int key; struct Node* left; struct Node* right; }; struct Node* newNode(int key){ // initializing our node struct Node* node = new Node(); node->left = NULL; node->right = NULL; node->key = key; return node; } void maximumBends(struct Node* node,char direction, int bends, int* maxBends, int soFar,int* len){ if (node == NULL) // if null is reached return; if (node->left == NULL && node->right == NULL) { // if we reach the leaf node then //we check if we have to update our answer or not if (bends > *maxBends) { *maxBends = bends; *len = soFar; } } else { if (direction == 'l') { // current direction is left maximumBends(node->left, direction,bends, maxBends,soFar + 1, len); maximumBends(node->right, 'r',bends + 1, maxBends,soFar + 1, len); // if we change direction so bend also increases } else { maximumBends(node->right, direction,bends, maxBends,soFar + 1, len); maximumBends(node->left, 'l',bends + 1, maxBends,soFar + 1, len); // same as when direction was left } } } int main(){ struct Node* root = newNode(10); root->left = newNode(8); root->right = newNode(2); root->left->left = newNode(3); root->left->right = newNode(5); root->right->left = newNode(2); root->right->left->right = newNode(1); root->right->left->right->left = newNode(9); int len = 0, bends = 0, maxBends = -1; if(!root) // if tree is empty cout << "0\n"; else{ if (root->left) // if left subtree exists maximumBends(root->left, 'l',bends, &maxBends, 1, &len); if (root->right) // if right subtree exists maximumBends(root->right, 'r', bends,&maxBends, 1, &len); cout << len << "\n"; } return 0; }
ผลลัพธ์
4
คำอธิบายของโค้ดด้านบน
ในแนวทางข้างต้น เรากำลังสำรวจเส้นทางทั้งหมดและนับส่วนโค้งที่พบจนถึงตอนนี้เมื่อเราไปถึงจุดสิ้นสุดของเส้นทาง .i.e leaf node เราจะตรวจสอบว่าส่วนโค้งจนถึงที่นี่มากกว่าค่าสูงสุดก่อนหน้านี้หรือไม่ หาก เงื่อนไขเป็นจริง ดังนั้นเราจึงอัปเดตส่วนโค้งสูงสุดและความยาวของเส้นทางไปยังความยาวใหม่นี้ และนั่นคือวิธีที่โปรแกรมของเราดำเนินการ
บทสรุป
ในบทช่วยสอนนี้ เราแก้ปัญหาเพื่อค้นหาความยาวของเส้นทางที่มีจำนวนโค้งสูงสุด นอกจากนี้เรายังได้เรียนรู้โปรแกรม C++ สำหรับปัญหานี้และแนวทางที่สมบูรณ์ (ปกติ) ซึ่งเราแก้ไขปัญหานี้ เราสามารถเขียนโปรแกรมเดียวกันในภาษาอื่นๆ เช่น C, java, python และภาษาอื่นๆ เราหวังว่าคุณจะพบว่าบทช่วยสอนนี้มีประโยชน์