각 노드에 정수 키가 있는 이진 트리가 있다고 가정합니다. 주어진 값으로 합산되는 경로를 찾아야 합니다. 경로는 루트에서 리프로 시작해야 합니다. 합이 같은 경로를 찾아야 합니다.
트리가 [5,4,8,11,null,13,4,7,2,null,null,5,1]이고 합계가 22이면 -
가 됩니다.
경로는 [[5,4,11,2],[5,8,4,5]]입니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- dfs 함수를 사용하여 이 문제를 해결하십시오. dfs가 약간 수정되면 다음과 같이 작동합니다. 이 함수는 루트, 합계 및 하나의 임시 배열을 사용합니다.
- 루트가 없으면 반환
- 루트의 왼쪽과 루트의 오른쪽이 비어 있으면
- 합계 =루트 값이면
- temp에 root 값 삽입, 결과에 temp 삽입, temp에서 마지막 노드 삭제
- 반환
- 합계 =루트 값이면
- temp에 root 값 삽입
- dfs(루트 왼쪽, 합계 – 루트 값, 임시)
- dfs(루트 오른쪽, 합계 – 루트 값, 임시)
- temp에서 마지막 요소 삭제
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
#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, ],]