สมมุติว่าเรามีต้นไม้ต้นหนึ่ง ต้นไม้นี้ถูกรูทที่โหนด 0 ซึ่งจะมีดังต่อไปนี้ -
- จำนวนโหนดคือโหนด
- ค่าของโหนด ith คือค่า[i]
- พาเรนต์ของโหนด ith คือพาเรนต์[i]
เราต้องลบทรีย่อยทั้งหมดที่มีผลรวมของค่าของโหนดเป็น 0 หลังจากที่ทำเช่นนั้นแล้วจะคืนค่าจำนวนโหนดที่เหลืออยู่ในทรี ดังนั้นถ้าต้นไม้เป็นเหมือน −
มี 7 โหนด เอาต์พุตจะเป็น 2
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- สร้างแผนที่ชื่อเด็ก
- กำหนดวิธีการที่เรียกว่า dfs() ซึ่งจะรับโหนด ค่าอาร์เรย์ และกราฟ
- อุณหภูมิ :=คู่ (ค่า[โหนด], 1)
- สำหรับ i ในช่วง 0 ถึงขนาดของกราฟ[โหนด]
- temp2 :=dfs(graph[node, i], value, กราฟ)
- เพิ่มครั้งแรกก่อน temp2 เพิ่มวินาทีทีละวินาทีของ temp2
- ถ้าตัวแรกของ temp เป็น 0 แล้ว ans :=ans – วินาทีของ temp ให้ตั้งค่าวินาทีของ temp :=0
- อุณหภูมิกลับ
- จากวิธีหลัก จะใช้โหนด อาร์เรย์พาเรนต์ และอาร์เรย์ของค่า
- n :=จำนวนค่าที่มีอยู่ในอาร์เรย์ค่า
- ตอบ :=น
- กำหนดกราฟอาร์เรย์ขนาด n + 1
- สำหรับ i ในช่วง 1 ถึง n – 1
- แทรก i ลงในกราฟ[พาเรนต์[i]]
- dfs(0, ค่า, กราฟ)
- คืนสินค้า
ตัวอย่าง(C++)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; class Solution { public: map <int, int> children; int ans; pair <int, int> dfs(int node, vector<int>& value, vector <int> graph[]){ pair <int, int> temp = {value[node], 1}; for(int i = 0; i < graph[node].size(); i++){ pair <int, int> temp2 = dfs(graph[node][i], value, graph); temp.first += temp2.first; temp.second += temp2.second; } if(temp.first == 0){ ans -= temp.second; temp.second = 0; } return temp; } int deleteTreeNodes(int nodes, vector<int>& parent, vector<int>& value) { int n = value.size(); ans = n; children.clear(); vector < int > graph[n + 1]; for(int i = 1; i < n; i++){ graph[parent[i]].push_back(i); } dfs(0, value, graph); return ans; } }; main(){ vector<int> v1 = {-1,0,0,1,2,2,2}; vector<int> v2 = {1,-2,4,0,-2,-1,-1}; Solution ob; cout << (ob.deleteTreeNodes(7,v1, v2)); }
อินพุต
7 [-1,0,0,1,2,2,2] [1,-2,4,0,-2,-1,-1]
ผลลัพธ์
2