이진 트리? 그리고 경로!
제목
이진 트리와 대상 및 리프 노드에 루트 노드에서 모든 경로를 찾을 수 감안할 때 경로의 합 주어진 대상과 동일하다.
설명 : 잎 노드는 노드에 자식 노드가 없습니다.
예
예 :
다음 이진 트리 주어, 타겟과 합 = 22
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
반환 값 :
[
[5,4,11,2],
[5,8,4,5]
]
주제 분석
- 목표 : 그것의 접속점 ⇒ 잎 노드에 루트에서 시작하는 모든 경로를 찾을 수는 목표 값과 동일
- 잎 노드에 루트에서 경로를 찾기 ⇒ 재귀 솔루션을
- 노드 목표치 경로 ⇒ 추가의 합과 동일하면
문제 해결 아이디어
변수 | 효과 |
---|---|
찾기() | 경로 기능을 추구 |
방법
- 노드의 경로를 업데이트하기 위해 현재 노드를 추가 ⇒ 및
- 조건이 응답 경로를 추가 ⇒ 만족되면 리프 노드가 노드를 상기 목표 값의 합과 현재 노드와 동일한 분석되고
- 왼쪽 하위 트리의 현재의 노드에 빈 ⇒ 갱신 왼쪽 자식 노드를 반복 2,3,4없는 경우
- 오른쪽 하위 트리 현재 노드 빈 ⇒ 갱신 우측 자식 노드를 반복 2,3,4없는 경우
다음 코드는
void find(TreeNode*root, int add, int sum, vector<int> path, vector<vector<int>> &ans)
{
add += root->val; //更新结点和
path.push_back(root->val); //当前结点加入路径
if(add == sum&&!root->left&&!root->right) ans.push_back(path);
if(root->left) find(root->left,add,sum,path,ans);
if(root->right) find(root->right,add,sum,path,ans);
}
class Solution {
public:
vector<vector<int>> pathSum(TreeNode* root, int sum) {
if(!root) return{};
vector<vector<int>> ans;
vector<int> path;
int add =0;
find(root, add, sum, path, ans);
return ans;
}
};