力扣第19天----第669题、第108题、第538题
一、第669题–修剪二叉搜索树
也是一道,挑选相应节点,返回节点的题。
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if(root == nullptr) return nullptr; //终止条件,遇到nullptr,就nullptr节点。
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题–将有序数组转换为二叉搜索树
与105、106题较类似,整体思路也是不断递归划分数组,然后构建左右子树,建立与根节点关联。
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
if (nums.size() == 0) return nullptr;
int center_index = nums.size() / 2;
TreeNode* root = new TreeNode(nums[center_index]);
vector<int> nums_left(nums.begin(), nums.begin() + center_index);
vector<int> nums_right(nums.begin()+center_index+1, nums.end());
TreeNode* left = sortedArrayToBST(nums_left);
TreeNode* right = sortedArrayToBST(nums_right);
root->left = left;
root->right = right;
return root;
}
};
三、第538题–把二叉搜索树转换为累加树
右中左的遍历顺序,把上一位置根节点数值,加到现在这一位置上,然后再移动pre指向。
class Solution {
public:
void convert(TreeNode* root){
if (root == nullptr) return ;
// cout << pre << endl;
convert(root->right);
pre = root->val + pre;
root->val = pre;
convert(root->left);
}
TreeNode* convertBST(TreeNode* root) {
convert(root);
return root;
}
int pre = 0;
};