776. Split BST
Дан корень бинарного дерева поиска (BST) и 정수 target, разделите 트리 на два поддерева, где первое под트리 содержит узлы, которые меньше или равны значению target, а второе под트리 содержит узлы, которые больше значения target. Не обязательно, чтобы 트리 содержало узел со значением target.
Кроме того, большая часть структуры исходного дерева должна сохраниться. Формально, для любого потомка c с родителем p в исходном дереве, если они оба находятся в одном поддереве после разделения, то узел c все еще должен иметь родителя p.
return 배열 из двух корней двух поддеревьев в порядке.
예제:
Input: root = [4,2,6,1,3,5,7], target = 2
Output: [[2,1],[4,3,6,null,null,5,7]]
C# 해법
매칭됨/원본public class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int x) { val = x; }
}
public class Solution {
public TreeNode[] SplitBST(TreeNode root, int target) {
if (root == null) {
return new TreeNode[]{null, null};
}
if (root.val > target) {
TreeNode[] left = SplitBST(root.left, target);
root.left = left[1];
return new TreeNode[]{left[0], root};
} else {
TreeNode[] right = SplitBST(root.right, target);
root.right = right[0];
return new TreeNode[]{root, right[1]};
}
}
}
C++ 해법
자동 초안, 제출 전 검토#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
public class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int x) { val = x; }
}
class Solution {
public:
public TreeNode[] SplitBST(TreeNode root, int target) {
if (root == null) {
return new TreeNode[]{null, null};
}
if (root.val > target) {
TreeNode[] left = SplitBST(root.left, target);
root.left = left[1];
return new TreeNode[]{left[0], root};
} else {
TreeNode[] right = SplitBST(root.right, target);
root.right = right[0];
return new TreeNode[]{root, right[1]};
}
}
}
Java 해법
매칭됨/원본class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
class Solution {
public TreeNode[] splitBST(TreeNode root, int target) {
if (root == null) {
return new TreeNode[]{null, null};
}
if (root.val > target) {
TreeNode[] left = splitBST(root.left, target);
root.left = left[1];
return new TreeNode[]{left[0], root};
} else {
TreeNode[] right = splitBST(root.right, target);
root.right = right[0];
return new TreeNode[]{root, right[1]};
}
}
}
JavaScript 해법
매칭됨/원본function TreeNode(val) {
this.val = val;
this.left = this.right = null;
}
var splitBST = function(root, target) {
if (!root) {
return [null, null];
}
if (root.val > target) {
let left = splitBST(root.left, target);
root.left = left[1];
return [left[0], root];
} else {
let right = splitBST(root.right, target);
root.right = right[0];
return [root, right[1]];
}
};
Python 해법
매칭됨/원본class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def splitBST(self, root: TreeNode, target: int) -> List[TreeNode]:
if not root:
return [None, None]
if root.val > target:
left = self.splitBST(root.left, target)
root.left = left[1]
return [left[0], root]
else:
right = self.splitBST(root.right, target)
root.right = right[0]
return [root, right[1]]
Go 해법
매칭됨/원본type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
func splitBST(root *TreeNode, target int) []*TreeNode {
if root == nil {
return []*TreeNode{nil, nil}
}
if root.Val > target {
left := splitBST(root.Left, target)
root.Left = left[1]
return []*TreeNode{left[0], root}
} else {
right := splitBST(root.Right, target)
root.Right = right[0]
return []*TreeNode{root, right[1]}
}
}
Algorithm
Базовый случай: Если корень равен null, return 배열, содержащий два указателя null. Это необходимо для обработки случая, когда 트리 пустое.
Проверьте, больше ли значение корня целевого значения. Если да, рекурсивно разделите левое под트리, вызвав splitBST(root->left, target). Прикрепите правую часть разделенного к левому поддереву корня. return 배열, содержащий левую часть разделенного и текущий корень.
Если значение корня меньше или равно целевому значению, рекурсивно разделите правое под트리, вызвав splitBST(root->right, target). Прикрепите левую часть разделенного к правому поддереву корня. return 배열, содержащий левую часть разделенного и текущий корень.
😎
Vacancies for this task
활성 채용 with overlapping task tags are 표시됨.