530.二叉搜索树的最小绝对差
跟昨天验证二叉搜索树的双指针思路一样。
501.二叉搜索树中的众数
暴力法:遍历一遍,数值和频率存入map,再对map排序。
也可以采用双指针,而且最大频率是可以实时更新的,当遇到了更大的最大频率值,把之前存入结果的数值清空再重新放即可。
class Solution {
public:
TreeNode* pre=nullptr;
int count=0;int maxfre=0;
vector<int> result;
void maxFrequency(TreeNode* cur){
if(cur==nullptr) return;
maxFrequency(cur->left);
if(pre==nullptr) count=1;
else{
if(pre->val==cur->val) count++;
else count=1;
}
if(count==maxfre){
result.push_back(cur->val);
}
if(count>maxfre){
maxfre=count;
result.clear();
result.push_back(cur->val);
}
pre=cur;
maxFrequency(cur->right);
}
vector<int> findMode(TreeNode* root) {
maxFrequency(root);
return result;
}
};
235.二叉树搜索树的最近公众祖先
利用二叉搜索树不需要全部遍历,是有方向的寻找。所以当我们从上向下去递归遍历,第一次遇到 cur节点是数值在[p, q]区间中,那么cur就是 p和q的最近公共祖先。
而递归遍历顺序,本题就不涉及到 前中后序了(这里没有中节点的处理逻辑,遍历顺序无所谓了)
另外关于递归逻辑中,要明确是找一条边还是找整棵树,如果是一条边,遇到递归函数的返回值,如果不为空,立刻返回。
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
//if(root==NULL) return root;
if(root->val>q->val && root->val>p->val){
return lowestCommonAncestor(root->left,p,q);
}
else if(root->val<q->val && root->val<p->val){
return lowestCommonAncestor(root->right,p,q);
}
else
return root;
}
};
迭代法:
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
while(root){
if(root->val>q->val && root->val>p->val)
root=root->left;
else if(root->val<q->val && root->val<p->val)
root=root->right;
else
break;
}
return root;
}
};