530.二叉搜索树的最小绝对差
需要领悟一下二叉树遍历上双指针操作,优先掌握递归
题目链接/文章讲解:代码随想录
视频讲解:二叉搜索树中,需要掌握如何双指针遍历!| LeetCode:530.二叉搜索树的最小绝对差_哔哩哔哩_bilibili
/**
* 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> traversal(TreeNode* node){
vector<int>res;
queue<TreeNode*>que;
if(node)que.push(node);
while (!que.empty()){
TreeNode* cur=que.front();
que.pop();
res.push_back(cur->val);
if (cur->left)que.push(cur->left);
if (cur->right)que.push(cur->right);
}
return res;
}
int getMinimumDifference(TreeNode* root) {
vector<int>res;
res=traversal(root);
sort(res.begin(),res.end());
int ans=1e6;
for (int i=1;i<res.size();i++){
ans=min(res[i]-res[i-1],ans);
}
return ans;
}
};
501.二叉搜索树中的众数
和 530差不多双指针思路,不过 这里涉及到一个很巧妙的代码技巧。
可以先自己做做看,然后看我的视频讲解。
视频讲解:不仅双指针,还有代码技巧可以惊艳到你! | LeetCode:501.二叉搜索树中的众数_哔哩哔哩_bilibili
/**
* 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:
void traversal(TreeNode* node,vector<int>&res){
if (!node)return;
traversal(node->left,res);
res.push_back(node->val);
traversal(node->right,res);
}
vector<int> findMode(TreeNode* root) {
vector<int>nums;
traversal(root, nums);
vector<int>res;
int ans_time=0;
for (int i=0;i<nums.size();i++){
int time=1;
while (i+1<nums.size() && nums[i]==nums[i+1]){
i++;time++;
}
if (time>ans_time){
res.clear();
res.push_back(nums[i]);
ans_time=time;
}
else if (time==ans_time)res.push_back(nums[i]);
}
return res;
}
};
236. 二叉树的最近公共祖先
本题其实是比较难的,可以先看我的视频讲解
视频讲解:自底向上查找,有点难度! | LeetCode:236. 二叉树的最近公共祖先_哔哩哔哩_bilibili
/**
* 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* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if (root==p || root==q || !root)return root;
TreeNode* left=lowestCommonAncestor(root->left,p,q);
TreeNode* right=lowestCommonAncestor(root->right,p,q);
if (left && right)return root;
else if (right && left==NULL)return right;
else if (left && right==NULL)return left;
else return NULL;
}
};
总结
感觉确实,回溯什么在看视频之前不是很清楚,看完之后就清晰了。