[Leetcode] 776. Split BST 解题报告

这篇博客详细介绍了如何解决LeetCode上的776题——分割BST。根据给定的目标值,文章阐述了如何保持BST原有的结构并将其分成两部分,一部分节点值小于等于目标值,另一部分节点值大于目标值。博主通过分析指出,无论何时,根节点总会包含在结果中,并基于此提出了一种递归解决方案,以保持原始树的结构。代码实现简洁明了。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

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:

  1. The size of the BST will not exceed 50.
  2. 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;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值