Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ค้นหาระยะห่างระหว่างสองโหนดในต้นไม้ไบนารี O(log n) ใน C++


ภาพรวมปัญหา

หาความห่างระหว่างสองโหนดในต้นไม้ไบนารี (จำนวนขอบที่ต้องเดิน) โดยใช้วิธี O(log n) ต่อคำถาม

หลักการ

Distance(u, v) = Level[u] + Level[v] - 2 × Level[LCA(u, v)]

ใช้ Euler Tour + Segment Tree เพื่อหา LCA แบบ O(log n)

ขั้นตอน

  1. คำนวณ Level ของทุกโหนดด้วย BFS
  2. สร้าง Euler Tour Array
  3. สร้าง Segment Tree บน Euler Tour สำหรับ RMQ (Range Minimum Query) เพื่อหา LCA
  4. ตอบคำถามแต่ละคำถามใน O(log n)

ตัวอย่างโค้ด C++

#include <bits/stdc++.h>
#define MAX 1000
using namespace std;

// ... (โค้ดเต็มสำหรับ Euler Tour + Segment Tree LCA)
// ดูรายละเอียดในเนื้อหาต้นฉบับ

int main() {
    // สร้างต้นไม้ตัวอย่าง
    // ตอบคำถามระยะห่าง
    return 0;
}

ผลลัพธ์ตัวอย่าง

Distance between nodes: 2, 4, 3, 1