6.18二叉搜索树的最小绝对差
class Solution {
public:
vector<int> vec;
void traversal(TreeNode * bt){//将二叉搜索树的所有结点放入容器中,中序遍历
if(!bt) return;
traversal(bt->left);
vec.push_back(bt->val);
traversal(bt->right);
}
int getMinimumDifference(TreeNode* root) {
int result = INT_MAX;
traversal(root);
for(int i=1;i<vec.size();i++){//i从1开始
result = min(vec[i]-vec[i-1],result);//找寻result和当前值减去前一个值的插值(正数)之间的更小的值
}
return result;
}
};
6.19二叉搜索树的众数
class Solution {
public:
vector<int> vec;
vector<int> result = {0};
void traversal(TreeNode* bt){
if(!bt) return;
traversal(bt->left);
vec.push_back(bt->val);
traversal(bt->right);
}
vector<int> findMode(TreeNode* root) {
traversal(root);
int count = 0;
int maxfreq=0;//最大频率数
if(vec.size()==0) return result;
for(int i = 1;i < vec.size();i++){
if(vec[i]==vec[i-1])//当前与前一个相等则计数加一
count++;
else
count = 0;
if(count==maxfreq)//计数的值是最大值则纳入容器
result.push_back(vec[i]);
if(count>maxfreq){//计数值大于最大值则先删除容器所有值,再将当前值纳入
maxfreq = count;
result.clear();
result.push_back(vec[i]);
}
}
return result;
}
};
6.20二叉树的最近公共祖先
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root == p||root == q||!root) return root;//当存在p或q就是公共结点时,其子树包含p,q不需要遍历
TreeNode* leftnode = lowestCommonAncestor(root->left,p,q);
TreeNode* rightnode = lowestCommonAncestor(root->right,p,q);
if(leftnode && rightnode)
return root;
if(!leftnode && rightnode) //左子树返回null,右子树存在,则仅仅返回右子树
return rightnode;
else if(!rightnode && leftnode)
return leftnode;
else//左右子树都不存在,即都返回NULL
return NULL;
}
};
6.21二叉搜索树的最近公共祖先
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root->val>p->val && root->val>q->val)//当前根节点的值大于p且q,根据BST,应该去寻找左子树
return lowestCommonAncestor(root->left,p,q);
else if(root->val<p->val && root->val<q->val)
return lowestCommonAncestor(root->right,p,q);
else//此时根节点的值[p,q]这个区间在,且是第一次找到这个区间的数,即是公共结点
return root;
}
};