前言
LeetCode题目:LeetCode 530、501、236
Takeaway:今天的题目都是递归+回溯+二叉搜索树,要会用二叉搜索树+双指针!
一、530
二叉搜索树的应用,整体没有难度
/**
* 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:
map<int, int> res;
void traverse(TreeNode* root){
if(root == NULL){
return;
}
traverse(root->left);
//
if(res.find(root->val)!=res.end()){
map.first++;
}
res.insert(pair<int, int>(1, res->val));
traverse(root->right);
}
int getMinimumDifference(TreeNode* root) {
traverse(root);
int diff = INT_MAX;
for(int i=0; i<res.size(); i++){
}
return diff;
}
};
二、501
二叉搜索树+双指针的应用,以及如何一次性找到所有众数(新的答案出来就清空vector)。
/**
* 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:
vector<int> result;
int max_time=0;
//前指针,用来和cur指针比较是否相等的
TreeNode* pre =NULL;
int count = 0;
void traverse(TreeNode* cur) {
if(cur == NULL){
return;
}
traverse(cur->left);
if(pre == NULL){
count = 1;
}else if(pre->val == cur->val){
count++;
}else{
count = 1;
}
pre = cur;
if(count == max_time){ // 也是最大值
result.push_back(cur->val);
}else if(count > max_time){ // 最大值更新了,清空老答案,加入新答案
max_time = count;
result.clear();
result.push_back(cur->val);
}
traverse(cur->right);
}
vector<int> findMode(TreeNode* root) {
traverse(root);
return result;
}
};
三、236
重点是理解思路,理解单层递归是如何处理的,返回为NULL就是没有,返回不为NULL就是找到了,根据这个逻辑进行处理。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* traverse(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root==NULL || root->val==p->val || root->val==q->val){
return root;
}
TreeNode* leftChild = traverse(root->left, p, q);
TreeNode* rightChild = traverse(root->right, p, q);
if(leftChild != NULL && rightChild != NULL)
return root;
if(leftChild==NULL&&rightChild!=NULL){
return rightChild;
}else if(leftChild!=NULL&&rightChild==NULL){
return leftChild;
}
return NULL;
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
TreeNode* ans = traverse(root, p, q);
return ans;
}
};
总结
今天的题目都是递归+回溯+二叉搜索树,要会用二叉搜索树+双指针!