前言
LeetCode题目:LeetCode 669、108、538
Takeaway:今天的题目仍然都是递归+回溯+二叉搜索树,总体和昨天不变,只是对每层递归的逻辑处理和递归顺序有了更深刻的认识
一、669
利用二叉搜索树的特性,root小时直接舍弃左子,root大时直接舍弃右子。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if(root==NULL){
return NULL;
}
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->right = trimBST(root->right, low, high);
return root;
}
};
二、108
找中间点,比之前的那个中序+后序构建二叉树简单多了。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
if(nums.size() == 0){
return NULL;
}
int mid = nums.size()/2;
TreeNode* root = new TreeNode(nums[mid]);
vector<int> leftSide = vector(nums.begin(), nums.begin()+mid);
vector<int> rightSide = vector(nums.begin()+mid+1, nums.end());
root->left = sortedArrayToBST(leftSide);
root->right = sortedArrayToBST(rightSide);
return root;
}
};
三、538
中序遍历反着写就行。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int pre = 0;
void Traverse(TreeNode* root) {
if(root == NULL){
return;
}
Traverse(root->right);
//处理
root->val += pre;
pre = root->val;
Traverse(root->left);
}
TreeNode* convertBST(TreeNode* root) {
if(root == NULL){
return NULL;
}
Traverse(root);
return root;
}
};
总结
今天的题目仍然都是递归+回溯+二叉搜索树,总体和昨天不变,只是对每层递归的逻辑处理和递归顺序有了更深刻的认识