ในปัญหานี้ เราได้รับรายการที่อยู่ติดกันซึ่งแสดงถึงต้นไม้ n-ary งานของเราคือการหาจำนวนของทรีย่อยขนาดคู่ ในทรี n-ary
ต้นไม้นารี ถูกกำหนดให้เป็นชุดของโหนดที่ปกติจะแสดงตามลำดับชั้นในลักษณะต่อไปนี้
ต้นไม้เริ่มต้นที่โหนดราก
แต่ละโหนดของแผนผังจะเก็บรักษารายการตัวชี้ไปยังโหนดย่อย
จำนวนโหนดย่อยน้อยกว่าหรือเท่ากับ m
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
ป้อนข้อมูล:
ผลลัพธ์: 4
คำอธิบาย:
ต้นไม้ที่รูทด้วย 7 มีขนาดเท่ากัน
ต้นไม้ที่หยั่งรากด้วย 2 มีขนาดเท่ากัน
ต้นไม้ที่รูทด้วย 0 จะมีขนาดเท่ากัน
ต้นไม้ที่รูทด้วย 3 ตัวจะมีขนาดเท่ากัน
แนวทางการแก้ปัญหา -
วิธีง่ายๆ คือการนับโหนดย่อยทั้งหมดสำหรับโหนดที่กำหนด หากเป็นการเพิ่มจำนวนevenTreeCount สำหรับสิ่งนี้ เราจะใช้ DFS และค้นหาความยาวของ SubTree สำหรับโหนดที่กำหนด
เราสามารถทำได้โดยใช้ การข้ามผ่านต้นไม้เพียงครั้งเดียว โดยการค้นหาขนาดของทรีย่อยของโหนดย่อยแต่ละโหนดซ้ำแล้วซ้ำอีก จากนั้นตรวจสอบขนาดและถ้าเป็นขนาดเท่ากัน ให้เพิ่มevenTreeCount ไม่เช่นนั้นให้ปล่อยไว้
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; int countEventSizeSubTree(vector<int> adj[], int n, int v, int& EvenCount){ int size = 1; for (auto ele : adj[v]) { size += countEventSizeSubTree(adj, n, ele, EvenCount); } if (size % 2 == 0) EvenCount++; return size; } int main(){ int n; n = 10; vector<int> adj[n + 1]; adj[7].push_back(2); adj[7].push_back(9); adj[2].push_back(0); adj[2].push_back(1); adj[9].push_back(3); adj[3].push_back(8); adj[0].push_back(5); int EvenCount = 0; countEventSizeSubTree(adj, n, 1, EvenCount); cout<<"Even Size SubTree are "<<EvenCount; return 0; }
ผลลัพธ์ -
Even Size SubTree are 0