솔루션: 트리에 행 하나 추가
Leetcode 문제 #623(중간): 트리에 하나의 행 추가
설명:
(다음으로 이동: Solution Idea || 코드: JavaScript | Python | Java | C++ )
Given the
root
of a binary tree, then valuev
and depthd
, you need to add a row of nodes with valuev
at the given depthd
. Theroot
node is at depth1
.The adding rule is: given a positive integer depth
d
, for each NOT null tree nodesN
in depthd-1
, create two tree nodes with valuev
asN
's left subtree root and right subtree root. AndN
's original left subtree should be the left subtree of the new left subtree root, its original right subtree should be the right subtree of the new right subtree root. If depthd
is1
that means there is no depthd-1
at all, then create a tree node with valuev
as the new root of the whole original tree, and the original tree is the new root's left subtree.
예:
Example 1: Input: A binary tree as following:
v = 1
d = 2Output:
Example 2: Input: A binary tree as following:
v = 1
d = 3Output:
제약:
- The given
d
is in range[1, maximum depth of the given tree + 1]
.- The given binary tree has at least one tree node.
아이디어:
(다음으로 이동: Problem Description || 코드: JavaScript | Python | Java | C++ )
여러 가지 방법으로 이 문제를 확실히 해결할 수 있지만 가능하면 항상 재귀를 사용합니다. 특히 별도의 재귀 도우미 함수를 정의하지 않고 기본 함수를 간단히 재귀할 수 있는 경우에는 더욱 그렇습니다. 재귀 경로는 DFS(깊이 우선 검색) 솔루션입니다.
깊이 변수(d)를 일종의 카운트다운으로 사용할 수 있으며 대상 행에 도달할 때까지 트리를 통해 아래로 이동하면서 감소시킵니다. d에 있는 새 노드를 부모 노드에 연결해야 하므로 d = 1이 아니라 d = 2일 때 실제로 작업을 수행해야 부모 노드에 액세스할 수 있습니다.
이것은 또한 우리가 d의 원래 값이 1일 때의 스티키 에지 케이스를 처리할 수 있게 해줍니다. 원래 루트에 대한 부모가 없기 때문에 반환하기 전에 새 노드를 생성하고 여기에 루트를 연결해야 합니다. 이것은 초기 함수 호출에서만 발생할 수 있습니다. 그렇지 않으면 이후 재귀에서 d = 1에 도달하지 않습니다.
이 함수는 재귀할 때마다 노드를 반환하지만 함수가 내부적으로 호출될 때 반환 값으로 아무 작업도 수행하지 않기 때문에 원래 함수 호출에서만 실제로 의미가 있습니다.
이는 재귀를 통해 노드 참조를 전달하므로 반환 값에 관계없이 트리 개체가 수정되기 때문에 작동합니다.
구현:
코드는 네 가지 언어 모두에서 거의 동일합니다.
자바스크립트 코드:
(다음으로 이동: Problem Description || Solution Idea )
var addOneRow = function(root, v, d) {
if (d === 1) return new TreeNode(v, root, null)
if (d === 2) {
root.left = new TreeNode(v, root.left, null)
root.right = new TreeNode(v, null, root.right)
} else {
if (root.left) addOneRow(root.left, v, d-1)
if (root.right) addOneRow(root.right, v, d-1)
}
return root
};
파이썬 코드:
(다음으로 이동: Problem Description || Solution Idea )
class Solution:
def addOneRow(self, root: TreeNode, v: int, d: int) -> TreeNode:
if d == 1: return TreeNode(v, root, None)
elif d == 2:
root.left = TreeNode(v, root.left, None)
root.right = TreeNode(v, None, root.right)
else:
if root.left: self.addOneRow(root.left, v, d-1)
if root.right: self.addOneRow(root.right, v, d-1)
return root
자바 코드:
(다음으로 이동: Problem Description || Solution Idea )
class Solution {
public TreeNode addOneRow(TreeNode root, int v, int d) {
if (d == 1) return new TreeNode(v, root, null);
else if (d == 2) {
root.left = new TreeNode(v, root.left, null);
root.right = new TreeNode(v, null, root.right);
} else {
if (root.left != null) addOneRow(root.left, v, d-1);
if (root.right != null) addOneRow(root.right, v, d-1);
}
return root;
}
}
C++ 코드:
(다음으로 이동: Problem Description || Solution Idea )
class Solution {
public:
TreeNode* addOneRow(TreeNode* root, int v, int d) {
if (d == 1) return new TreeNode(v, root, NULL);
else if (d == 2) {
root->left = new TreeNode(v, root->left, NULL);
root->right = new TreeNode(v, NULL, root->right);
} else {
if (root->left) addOneRow(root->left, v, d-1);
if (root->right) addOneRow(root->right, v, d-1);
}
return root;
}
};
Reference
이 문제에 관하여(솔루션: 트리에 행 하나 추가), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/seanpgallivan/solution-add-one-row-to-tree-1lc2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)