LeetCode530
题目:
解法:
class Solution {
public:
vector<int> vec;
int min = 100000;
void get(TreeNode* node){
if(node == NULL) return;
if(node -> left) get(node -> left);
if(vec.size() >= 1 && min > abs(node ->val - vec.back())) min = abs(node ->val - vec.back());
vec.push_back(node -> val);
if(node -> right) get(node -> right);
}
int getMinimumDifference(TreeNode* root) {
get(root);
return min;
}
};
LeetCode 501
题目:
解法1:(通用解法)
class Solution {
public:
void findmuch(TreeNode* node,unordered_map<int,int> &map){
if(node == NULL) return;
map[node -> val]++;
findmuch(node -> left,map);
findmuch(node -> right,map);
return;
}
bool static cmp(const pair<int,int> &a,pair<int,int> &b){
return a.second > b.second;
}
vector<int> findMode(TreeNode* root) {
unordered_map<int,int> mp;
vector<int> result;
if(root == NULL) return result;
findmuch(root, mp);
vector<pair<int,int>> vec(mp.begin(),mp.end());
sort(vec.begin(),vec.end(),cmp);
result.push_back(vec[0].first);
for(int i = 1 ; i < vec.size(); i++){
if(vec[i].second == vec[0].second){
result.push_back(vec[i].first);
}
}
return result;
}
};
解法2:(双指针)
class Solution {
public:
vector<int> result;
int count = 0;
TreeNode* pre = NULL;
int MAX = 0;
void findmuch(TreeNode* node){
if(node == NULL) return;
if(node -> left) findmuch(node ->left);
if(pre == NULL) count = 1;
else if(pre->val == node ->val) count ++;
else count = 1;
pre = node;
if(count == MAX) result.push_back(node -> val);
if(count > MAX ){
MAX = count;
result.clear();
result.push_back(node -> val);
}
if(node -> right) findmuch(node ->right);
return;
}
vector<int> findMode(TreeNode* root) {
findmuch(root);
return result;
}
};
LeetCode236:
题目:
解法1:(返回bool)
class Solution {
public:
TreeNode* common = NULL;
bool findcommon(TreeNode* node,TreeNode* p, TreeNode* q){
bool leftb = false,rightb = false,nodeb = false;
if(node -> left) leftb = findcommon(node ->left,p,q);
if(node -> right) rightb = findcommon(node ->right,p,q);
if(node == p) nodeb = true;
if(node == q) nodeb = true;
if((!nodeb && rightb && !leftb) ||(!nodeb && leftb && !rightb)) return true;
if((leftb && rightb)|| (leftb && nodeb) ||(rightb && nodeb)) common = node;
return nodeb;
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
bool nodeb = findcommon(root, p, q);
return common;
}
};
解法2:(返回节点)
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
TreeNode* nodeleft = NULL;
TreeNode* noderight = NULL;
if(root -> left) nodeleft = lowestCommonAncestor(root ->left, p, q);
if(root -> right) noderight = lowestCommonAncestor(root ->right, p, q);
if(root == NULL || root == p || root == q) return root;
if(nodeleft && noderight) return root;
if(nodeleft && !noderight) return nodeleft;
if(!nodeleft && noderight) return noderight;
return NULL;
}
};