สมมติว่าเราได้ให้ไบนารีทรีซึ่งแต่ละโหนดมีคีย์จำนวนเต็ม เราต้องหาเส้นทางที่รวมกันเป็นค่าที่กำหนด เส้นทางควรเริ่มจากรากสู่ใบ เราต้องหาเส้นทางที่ผลรวมเท่ากัน
หากต้นไม้เป็นเหมือน [5,4,8,11,null,13,4,7,2,null,null,5,1] และผลรวมคือ 22 มันจะเป็น –
เส้นทางคือ [[5,4,11,2],[5,8,4,5]].
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- ใช้ฟังก์ชัน dfs เพื่อแก้ปัญหานี้ dfs มีการปรับเปลี่ยนเล็กน้อย ซึ่งจะทำงานได้ดังนี้ ฟังก์ชันนี้จะรับรูท ผลรวม และอาร์เรย์ชั่วคราวหนึ่งรายการ
- หากไม่มีรูทให้ส่งคืน
- ถ้าทางซ้ายของรูทและทางขวาของรูทว่างเปล่า
- ถ้า sum =ค่าของ root แล้ว
- ใส่ค่าของ root ลงใน temp, แทรก temp ลงในผลลัพธ์ และลบโหนดสุดท้ายออกจาก temp
- คืนสินค้า
- ถ้า sum =ค่าของ root แล้ว
- ใส่ค่าของ root ลงใน temp
- dfs(ซ้ายของรูท, ผลรวม – ค่าของรูท, อุณหภูมิ)
- dfs(ด้านขวาของรูท, ผลรวม – ค่าของรูท, อุณหภูมิ)
- ลบองค์ประกอบสุดท้ายออกจากชั่วคราว
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; void print_vector(vector<vector<int> > v){ cout << "["; for(int i = 0; i<v.size(); i++){ cout << "["; for(int j = 0; j <v[i].size(); j++){ cout << v[i][j] << ", "; } cout << "],"; } cout << "]"<<endl; } class TreeNode{ public: int val; TreeNode *left, *right; TreeNode(int data){ val = data; left = right = NULL; } }; void insert(TreeNode **root, int val){ queue<TreeNode*> q; q.push(*root); while(q.size()){ TreeNode *temp = q.front(); q.pop(); if(!temp->left){ if(val != NULL) temp->left = new TreeNode(val); else temp->left = new TreeNode(0); return; } else { q.push(temp->left); } if(!temp->right){ if(val != NULL) temp->right = new TreeNode(val); else temp->right = new TreeNode(0); return; } else { q.push(temp->right); } } } TreeNode *make_tree(vector<int> v){ TreeNode *root = new TreeNode(v[0]); for(int i = 1; i<v.size(); i++){ insert(&root, v[i]); } return root; } class Solution { public: vector < vector <int> > res; void dfs(TreeNode* root, int sum, vector <int>& temp){ if(!root)return; if(!root->left && !root->right){ if(sum == root->val){ temp.push_back(root->val); res.push_back(temp); temp.pop_back(); } return; } temp.push_back(root->val); dfs(root->left, sum - root->val, temp); dfs(root->right, sum - root->val, temp); temp.pop_back(); } vector<vector<int>> pathSum(TreeNode* root, int sum) { res.clear(); vector <int> temp; dfs(root, sum, temp); return res; } }; main(){ Solution ob; vector<int> v = {5,4,8,11,NULL,13,4,7,2,NULL,NULL,NULL,NULL,5,1}; TreeNode *root = make_tree(v); print_vector(ob.pathSum(root, 22)); }
อินพุต
[5,4,8,11,null,13,4,7,2,null,null,5,1] 22
ผลลัพธ์
[[5, 4, 11, 2, ],[5, 8, 4, 5, ],]