二叉搜索树的最小绝对差
题目解答
/**
* 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:
int a=INT_MAX;
TreeNode* pre=NULL;
void func(TreeNode* cur){
if(cur==NULL) return;
func(cur->left);
if(pre) a=min(a, abs(cur->val - pre->val));
pre=cur;
func(cur->right);
}
int getMinimumDifference(TreeNode* root) {
if(root==NULL) return 0;
func(root);
return a;
}
};
解题说明
当然,该题接是看了卡哥的代码才写出来的,卡哥的题解十分的优雅,标记了前后的两个元素,然后去遍历求差,而且如果pre为空时,就不做操作。
我当时写的代码也是同样的思路和卡子哥的大题相当,但是没有他的优雅:
/**
* 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:
int a=INT_MAX;
void func(TreeNode* root, int& role, bool& flag){
if(root==NULL) return;
func(root->left, role, flag);
if(flag==0) flag=1;
else a=min(a,abs(root->val-role));
role=root->val;
func(root->right, role, flag);
return;
}
int getMinimumDifference(TreeNode* root) {
int role=0;
bool flag=0;
func(root,role, flag);
return a;
}
};
二叉搜索树中的众数(本篇重点)
方法1
题目解答
class Solution {
private:
void searchBST(TreeNode* cur, unordered_map<int, int>& map) { // 前序遍历
if (cur == NULL) return ;
map[cur->val]++; // 统计元素频率
searchBST(cur->left, map);
searchBST(cur->right, map);
return ;
}
bool static cmp (const pair<int, int>& a, const pair<int, int>& b) {
return a.second > b.second;
}
public:
vector<int> findMode(TreeNode* root) {
unordered_map<int, int> map; // key:元素,value:出现频率
vector<int> result;
if (root == NULL) return result;
searchBST(root, map);
vector<pair<int, int>> vec(map.begin(), map.end());
sort(vec.begin(), vec.end(), cmp); // 给频率排个序
result.push_back(vec[0].first);
for (int i = 1; i < vec.size(); i++) {
// 取最高的放到result数组中
if (vec[i].second == vec[0].second) result.push_back(vec[i].first);
else break;
}
return result;
}
};
说明
该方法使用了map容器来记录每个元素出现的频率,从而求出结果。(该方法就算不是平衡二叉树都能够适用)
方法2
题目解答
/**
* 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:
TreeNode* pre = NULL;
int count = 0;
int maxCount = 0;
vector<int> result;
void func(TreeNode* cur) {
if (cur == NULL) return;
func(cur->left);
if (!pre) count = 1;
else if (pre->val == cur->val) count++;
else count = 1;
pre = cur;
if (count == maxCount) result.push_back(cur->val);
else if (count > maxCount) {
result.clear();
maxCount = count;
result.push_back(cur->val);
}
func(cur->right);
return;
}
vector<int> findMode(TreeNode* root) {
count = 0;
maxCount = 0;
result.clear();
func(root);
return result;
}
};
说明
因为该二叉树是平衡二叉树,可以使用中序遍历,和pre指针, 当pre为空时count就为1, 每次向后遍历,当当前元素和pre的元素相等时,那么count就自增一位;当当前元素和pre元素和pre元素不相等时那么count就重置为1,也就是又重当前元素开始循环的自增了。
对于maxCount是用来记录最大的count数值的,如果count和maxCount相等,那么简单,就将当前元素放入数组就OK了;但是如果count大于maxCount的话,那么那么result数组就要clear,然后maxCount就等于count,再将当前的元素记录到result数组中。
二叉树的最近公共祖先
题目解答
/**
* 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==NULL || root==p || root==q ) return root;
TreeNode* left=lowestCommonAncestor(root->left, p, q);
TreeNode* right=lowestCommonAncestor(root->right, p, q);
if(left && right) return root;
if(left && !right) return left;
if(!left && right) return right;
else return NULL;
}
};
题目说明
题目有两种情况,对于第一种情况,不必多说,但是对于第二种情况,我们可以看到,
该二叉树对应的结果就是5,根据我们的代码,如果遍历到5的时候就直接返回了,也就是直接返回5了,根本就返回不到4!