DAY18 - 530.二叉搜索树的最小绝对差, 501.二叉搜索树中的众数, 236. 二叉树的最近公共祖先
530.二叉搜索树的最小绝对差
是BST,利用它的性质中序遍历一次即可得到结果。
class Solution {
public:
void traversal(TreeNode* node, int& mini, TreeNode*& pre){
if(node==nullptr) return;
traversal(node->left,mini,pre);
if(pre!=nullptr){
mini=min(mini,node->val-pre->val);
}
pre=node;
traversal(node->right,mini,pre);
}
int getMinimumDifference(TreeNode* root) {
int min=INT_MAX;
TreeNode* pre=nullptr;
traversal(root,min,pre);
return min;
}
};
- 在递归中需要注意什么时候按值传递什么时候引用传递。如果需要一个值在不同递归过程中都存在就要引用传递。
501.二叉搜索树中的众数
一开始想的是用map来记录每个数的出现频率,但是其实并不关注每个数的出现频率,只关注最大出现频率和结果数组,所以用一个int和一个vector作为额外空间即可。
class Solution {
private:
int maxcnt=0;
int cnt=0;
vector<int> res;
TreeNode* pre=nullptr;
void traversal(TreeNode* node){
if(node==nullptr) return;
traversal(node->left);
if(pre!=nullptr){
if(pre->val==node->val) cnt++;
else cnt=1;
if(cnt>maxcnt){
maxcnt=cnt;
res.clear();
res.push_back(node->val);
}else if(cnt==maxcnt){
res.push_back(node->val);
}
}else{
cnt=1;
maxcnt=1;
res.push_back(node->val);
}
pre=node;
traversal(node->right);
}
public:
vector<int> findMode(TreeNode* root) {
traversal(root);
return res;
}
};
236. 二叉树的最近公共祖先
一开始的想法是回溯法,记录到两个目标节点的path,然后再从后到前遍历path,找到交汇点。
后序遍历即可实现回溯,因为后序是左右中这个顺序。
公共祖先就两种情况:
-
root左子树中有p,右子树中有q
-
root自己就是p,左子or右子树中有q
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root==nullptr) return nullptr;
if(root==p||root==q) return root;
TreeNode* left=lowestCommonAncestor(root->left,p,q);
TreeNode* right=lowestCommonAncestor(root->right,p,q);
if(left!=nullptr&&right!=nullptr) return root;
if(left!=nullptr&&right==nullptr) return left;
if(left==nullptr&&right!=nullptr) return right;
return nullptr;
}
};
浙公网安备 33010602011771号