代码随想录算法训练营Day23 | 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树
LeetCode 669. 修剪二叉搜索树
思路:
两种情况
root->val < low or > high
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if(!root) return root;
if(root->val < low){
return trimBST(root->right, low, high);
}
if(root->val > high){
return trimBST(root->left, low, high);
}
root->left = trimBST(root->left, low, high);
root->right = trimBST(root->right, low, high);
return root;
}
};
LeetCode 108.将有序数组转换为二叉搜索树
题目链接:LeetCode 108.将有序数组转换为二叉搜索树
思路:
二分法思路
class Solution {
public:
TreeNode* traversal(vector<int>& nums, int left, int right){
if(left>right) return NULL;
int mid = left + ((right-left)/2);
TreeNode* root = new TreeNode(nums[mid]);
root->left = traversal(nums, left, mid-1);
root->right = traversal(nums, mid+1, right);
return root;
}
TreeNode* sortedArrayToBST(vector<int>& nums) {
return traversal(nums, 0, nums.size()-1);
}
};
注意 :
- 注意,left=right的情况可以合并不用单独写。
LeetCode 538.把二叉搜索树转换为累加树
题目链接:LeetCode 538.把二叉搜索树转换为累加树
思路:
逆中序遍历,双指针法。
class Solution {
public:
int pre = 0;
TreeNode* convertBST(TreeNode* root) {
if(!root) return NULL;
root->right = convertBST(root->right);
root->val += pre;
pre = root->val;
root->left = convertBST(root->left);
return root;
}
};
注意 :
- 可以用int指针存储pre。