Leetcode 113: 경로 총 II (가장 자세한 해법!!!)
19493 단어 Problemsleetcode 문제 풀이 가이드
설명: 잎 노드는 하위 노드가 없는 노드를 가리킨다.
예: 다음과 같은 두 갈래 트리와 목표 및
sum = 22
를 지정합니다. 5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
반환:
[
[5,4,11,2],
[5,8,4,5]
]
문제 풀이 사고방식
이 문제는 아래의 두 문제와 매우 유사하다.
Leetcode 112: 경로 총화(가장 자세한 해법!!!)
Leetcode 257: 두 갈래 나무의 모든 경로(가장 자세한 해법!!!)
방문한 노드가
일 때, 우리는 list
를 새로 만들어서 result
에 삽입한 다음 result
로 돌아갑니다.각각
를 훑어보고 그들을
앞에 꽂으면 된다.class Solution:
def pathSum(self, root, sum):
"""
:type root: TreeNode
:type sum: int
:rtype: List[List[int]]
"""
result = list()
if root == None:
return result
if not root.left and not root.right and sum == root.val:
result.append([root.val])
return result
left = self.pathSum(root.left, sum - root.val)
for i in left:
i.insert(0, root.val)
result.append(i)
right = self.pathSum(root.right, sum - root.val)
for i in right:
i.insert(0, root.val)
result.append(i)
return result
이 문제를 어떻게 교체해서 해결하는지 봅시다. 여기 저희와 이전 문제 Leetcode 257: 두 갈래 나무의 모든 경로(가장 상세한 해법!!!)
의 작법은 큰 차이가 없다. 단지
string
이 list
이 되고 변수sum
의 차이가 많아졌다.class Solution:
def pathSum(self, root, sum):
"""
:type root: TreeNode
:type sum: int
:rtype: List[List[int]]
"""
result = list()
if not root:
return result
stack = [(list(), sum, root)]
while stack:
path, val_, node = stack.pop()
if node:
path.append(node.val)
if not node.left and not node.right and val_ == node.val:
result.append(path)
stack += [(path.copy(), val_ - node.val, node.left), (path.copy(), val_ - node.val, node.right)]
return result
여기에서 우리는
path.copy()
에 주의해야 한다. 이것은 string
불변 유형이고 값을 통해 전달되기 때문이다. list
은 가변 유형이고 인용을 통해 전달되기 때문에 list
값을 통해 전달하려면 반드시 사용해야 한다copy
.이 문제의 첫 번째 귀속 실현
cpp
버전은 약간의 함정이 있어 나의 실현을 참고할 수 있다.class Solution
{
public:
vector<vector<int>> pathSum(TreeNode* root, int sum)
{
vector<vector<int>> result;
if (root == nullptr) return result;
if (root->left == nullptr and root->right == nullptr and sum == root->val)
{
result.push_back(vector<int>(1, root->val));// 1
return result;
}
vector<vector<int>> left = pathSum(root->left, sum - root->val);
for (auto& i : left)
{
i.insert(i.begin(), 1, root->val);// 2
result.push_back(i);
}
vector<vector<int>> right = pathSum(root->right, sum - root->val);
for (auto& i : right)
{
i.insert(i.begin(), 1, root->val);
result.push_back(i);
}
return result;
}
};
그래서 귀속하면 아래
의 방식으로 쓰는 것을 추천합니다.class Solution:
def pathSum(self, root, sum):
"""
:type root: TreeNode
:type sum: int
:rtype: List[List[int]]
"""
result = list()
if not root:
return result
self._pathSum(result, list(), root, sum)
return result
def _pathSum(self,result, path, node, num):
if node:
path.append(node.val)
if not node.left and not node.right and num == node.val:
result.append(path.copy())
self._pathSum(result, path, node.left, num - node.val)
self._pathSum(result, path, node.right, num - node.val)
path.pop()
이 질문의 다른 언어 버전을 GitHub Leetcode에 추가했습니다.
문제가 있으면 여러분이 지적해 주시기 바랍니다!!!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Leetcode 199: 두 갈래 나무의 오른쪽 보기(초상세 해법!!!)두 갈래 나무를 정해서 오른쪽에 서 있는 것을 상상하고 꼭대기에서 끝까지 순서대로 오른쪽에서 볼 수 있는 노드 값을 되돌려줍니다. 예: 문제 풀이 사고방식 이 문제는 사실 Leetcode 102: 두 갈래 나무의 차...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.