题目链接:669. 修剪二叉搜索树 - 力扣(LeetCode)
class Solution {
public:TreeNode* trimBST(TreeNode* root, int low, int high) {if (root == nullptr ) return nullptr;if (root->val < low) {TreeNode* right = trimBST(root->right, low, high); // 寻找符合区间[low, high]的节点return right;}if (root->val > high) {TreeNode* left = trimBST(root->left, low, high); // 寻找符合区间[low, high]的节点return left;}root->left = trimBST(root->left, low, high); // root->left接入符合条件的左孩子root->right = trimBST(root->right, low, high); // root->right接入符合条件的右孩子return root;}
};
这道题还是有点难度的,难点在于如何跳过(删除)一些节点去寻找他的子节点。
这里还是看了答案,自己有点混乱。
还是递归的老方法,从根节点出发,如果是比最小值还要小的就往右找,可以直接舍弃这个值找更大的符合的,同理,比最大值还要大的就往左找就行。在这里面有一些细节要注意一下,我们返回的是他的子节点,所以要创建一个指针。然后就是进行一个遍历,符合条件的就不管,不符合条件的才进入if语句进行处理。
题目链接:108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode)
class Solution
{
public:TreeNode *sortedArrayToBST(vector<int> &nums){if(nums.size()==0) return nullptr;int mid=(nums.size()-1)/2;TreeNode *root=new TreeNode(nums[mid]);vector<int> leftn(nums.begin(),nums.begin()+mid);if(leftn.size()!=0) root->left=sortedArrayToBST(leftn);vector<int> rightn(nums.begin()+mid+1,nums.end());if(rightn.size()!=0) root->right=sortedArrayToBST(rightn);return root;}
};
挺简单的一道题,我看了解析,发现我写的空间复杂度比较高。
因为是有序数组转二叉搜索树,关系已经是很对应了。我们递归找数组中间节点就行。
题目链接:538. 把二叉搜索树转换为累加树 - 力扣(LeetCode)
class Solution
{
private:int preSum=0;void reverseInOrder(TreeNode *root){if(!root) return;reverseInOrder(root->right);root->val+=preSum;preSum=root->val;reverseInOrder(root->left);}
public:TreeNode *convertBST(TreeNode *root){reverseInOrder(root);return root;}
};
这道题目乍一看好像很复杂。仔细想想后就会发现,这不是一个顺序反转的中序遍历吗。
中序遍历是左中右,这道题我们只要按照右中左的方式来累加就行了。
一个比较巧妙的技巧就是把这个累加值当作一个类的成员变量,这样子就可以在递归之外来改变他的值。