题目:
Given a Binary Search Tree (BST) with root node root, and a target value V,
split the tree into two subtrees where one subtree has nodes that are all smaller or equal to the target value, while the other subtree has all nodes that are greater than the target value. It's not necessarily the case that the tree contains a node with
value V.
Additionally, most of the structure of the original tree should remain. Formally, for any child C with parent P in the original tree, if they are both in the same subtree after the split, then node C should still have the parent P.
You should output the root TreeNode of both subtrees after splitting, in any order.
Example 1:
Input: root = [4,2,6,1,3,5,7], V = 2 Output: [[2,1],[4,3,6,null,null,5,7]] Explanation: Note that root, output[0], and output[1] are TreeNode objects, not arrays. The given tree [4,2,6,1,3,5,7] is represented by the following diagram: 4 / \ 2 6 / \ / \ 1 3 5 7 while the diagrams for the outputs are: 4 / \ 3 6 and 2 / \ / 5 7 1
Note:
- The size of the BST will not exceed
50. - The BST is always valid and each node's value is different.
思路:
通过观察我们首先发现,无论如何,root总是会包含在最终的返回结果中。然后就比较root的值和V的大小了:如果root的值比V大,那么root以及其右子树的结构都无需变化,只需要递归对root的左子树进行分割即可。需要注意的是,root的左子树中也有可能存在比V大的分支,所以我们需要将root的左子树中比V大的分支的树根接到root的左子树上。进一步分析可知,对root的左子树进行分割的思路和对root的分割完全一样,所以我们就可以采用递归调用进行处理了,代码十分简洁。
root的值小于等于V的情况可以对称得到处理。
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<TreeNode*> splitBST(TreeNode* root, int V) {
vector<TreeNode *> res(2, NULL);
if(root == NULL) {
return res;
}
if(root->val > V) { // the right child is retained
res[1] = root;
auto res1 = splitBST(root->left, V);
root->left = res1[1];
res[0]=res1[0];
}
else { // the left child is retained
res[0] = root;
auto res1 = splitBST(root->right, V);
root->right = res1[0];
res[1] = res1[1];
}
return res;
}
};
这篇博客详细介绍了如何解决LeetCode上的776题——分割BST。根据给定的目标值,文章阐述了如何保持BST原有的结构并将其分成两部分,一部分节点值小于等于目标值,另一部分节点值大于目标值。博主通过分析指出,无论何时,根节点总会包含在结果中,并基于此提出了一种递归解决方案,以保持原始树的结构。代码实现简洁明了。
837

被折叠的 条评论
为什么被折叠?



