ในบทช่วยสอนนี้ เราจะพูดถึงโปรแกรมพิมพ์เส้นทางจากโหนดรากของต้นไม้ไบนารีไปยังโหนดอื่นๆ ทั้งหมดที่อยู่ในต้นไม้ไบนารีที่กำหนด
ในโปรแกรมนี้ เราจะได้รับตัวเลข N แสดงจำนวนสมาชิกในต้นไม้ไบนารีจาก 1 ถึง N โดย 1 เป็นโหนดรากของต้นไม้ไบนารี ดังนั้นงานของเราคือพิมพ์เส้นทางทั้งหมดที่เป็นไปได้จากโหนดรากไปยังสมาชิกอื่นๆ ในต้นไม้ไบนารี
เพื่อแก้โปรแกรมนี้ เรารู้ว่าสำหรับโหนด i โหนดลูกซ้ายคำนวณได้จาก 2*i และโหนดลูกขวาคำนวณได้จาก 2*i+1 เราสามารถใช้ backtracking เก็บเส้นทางของสมาชิกเฉพาะใน vector แล้วพิมพ์เส้นทางทั้งหมดที่เป็นไปได้
ตัวอย่าง
#include <iostream>
#include <vector>
using namespace std;
// คำนวณเส้นทางทั้งหมดจากโหนดราก
void calc_allpath(vector<int> paths, int nth_node, int kth_node){
if (kth_node > nth_node)
return;
paths.push_back(kth_node);
for (int i = 0; i < paths.size(); i++)
cout << paths[i] << " ";
cout << endl;
calc_allpath(paths, nth_node, kth_node * 2);
calc_allpath(paths, nth_node, kth_node * 2 + 1);
}
// พิมพ์เส้นทางทั้งหมดจากโหนดราก
void print_allpath(int nth_node){
vector<int> paths;
calc_allpath(paths, nth_node, 1);
}
int main(){
int nth_node = 9;
print_allpath(nth_node);
return 0;
}
ผลลัพธ์
1 1 2 1 2 4 1 2 4 8 1 2 4 9 1 2 5 1 3 1 3 6 1 3 7