代码随想录算法训练营第二十三天
一、669.修剪二叉搜索树
思路
- 遇到小于范围的节点,返回其修剪后的右子树,因为其右子树有可能存在符合范围的节点。
- 遇到大于范围的节点,返回其修剪后的左子树,因为其左子树有可能存在符合范围的节点。
- 没碰到不符范围的节点,修剪其左右子树。
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if(root == NULL) return NULL;
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;
}
};
二、108.将有序数组转换为二叉搜索树
思路
和654.最大二叉树有点类似,根节点取数组中间节点,然后向下递归对应左右区间来构造二叉树,按照这样的逻辑,构造出来的二叉树自然就是平衡二叉树。
class Solution {
private:
TreeNode* traversal(vector<int>& nums, int left, int right){
if(left >= right) return NULL;
int mid = left + ((right - left) / 2);
int rootValue = nums[mid];
TreeNode* root = new TreeNode(rootValue);
root->left = traversal(nums, left, mid);
root->right = traversal(nums, mid+1, right);
return root;
}
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
return traversal(nums, 0, nums.size() );
}
};
三、538.把二叉搜索树转换成累加树
思路
理解好题目的意思,按右中左的顺序挨个遍历累加就好了。
class Solution {
private:
TreeNode* pre = NULL;
void traversal(TreeNode* cur) {
if(cur == NULL) return ;
traversal(cur->right);
if(pre != NULL){
cur->val += pre->val;
}
pre = cur;
traversal(cur->left);
}
public:
TreeNode* convertBST(TreeNode* root) {
traversal(root);
return root;
}
};