Harness持续交付平台入门:从本地部署到金丝雀发布实战
2026/6/24 23:17:16
输入:
二叉搜索树的根节点root,以及最小边界low和最大边界high。
要求:
修剪该二叉搜索树,使得所有节点的值都在[low, high]之间。
注意:可能需要改变树的根节点,修剪后的树必须保持二叉搜索树的相对结构(即:父子关系虽变,但原来的后代如果保留下来了,相对大小关系不变)。
输出:
修剪好的二叉搜索树的新的根节点TreeNode*。
思路:
这是一道经典的递归题目,借着这题来回顾一下递归三要素。
1. 确定递归函数的定义:
trim(root, low, high)的含义是:“给我一棵树的根节点root,我帮你把不符合[low, high]范围的节点剪掉,然后把修剪后合法的树的根节点返回给你。”2. 确定递归终止条件:
root为空(nullptr),说明遍历到了空节点,没什么好修剪的,直接返回nullptr。3. 确定单层递归逻辑(核心剪枝逻辑):
利用二叉搜索树(BST)的有序性(左 < 根 < 右)进行判断:
情况 A:当前节点太小了 (root->val < low)
low小,那么根据 BST 性质,它的左子树里所有节点肯定都比low小。[low, high]范围内的节点。return trim(root->right, ...)。情况 B:当前节点太大了 (root->val > high)
high大,那么它的右子树肯定全废了。return trim(root->left, ...)。情况 C:当前节点在范围内 (low <= root->val <= high)
root->left = trim(root->left, ...)root->right = trim(root->right, ...)root。复杂度:
classSolution{public:TreeNode*trimBST(TreeNode*root,intlow,inthigh){returntrim(root,low,high);}TreeNode*trim(TreeNode*root,intlow,inthigh){if(!root){returnnullptr;}if(root->val>=low&&root->val<=high){root->left=trim(root->left,low,high);root->right=trim(root->right,low,high);returnroot;}elseif(root->val<low){returntrim(root->right,low,high);}elseif(root->val>high){returntrim(root->left,low,high);}returnroot;}};