题目:
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;
}
};