530.二叉搜索树的最小绝对差
//耗时巨长写法
int min = INT_MAX;
int getMinimumDifference(TreeNode* root) {
queue<TreeNode*> qe;
if(root == nullptr){
return 0;
}
qe.push(root);
vector<vector<int>> result;
while(!qe.empty()){
int sz = qe.size();
vector<int> tmp;
for(int i = 0; i < sz; i++){
TreeNode* node = qe.front();
qe.pop();
tmp.push_back(node->val);
if(node->left) qe.push(node->left);
if(node->right) qe.push(node->right);
}
result.push_back(tmp);
}
for(int j = 0; j < result.size()-1; j++){
vector<int> pre = result[j];
for(int k = j+1; k < result.size(); k++){
vector<int> now = result[k];
for(int m = 0; m < pre.size(); m++){
int tmp_pre = pre[m];
for(int n = 0; n < now.size(); n++){
int tmp_now = now[n];
if(abs(tmp_pre-tmp_now) < min){
min = abs(tmp_pre-tmp_now);
}
}
}
}
}
return min;
}
//理解二叉搜索树的含义,以及双指针法记录前序指针的写法
int result = INT_MAX;
TreeNode* pre = nullptr;
void traverse(TreeNode* node){
if(node == nullptr){
return;
}
traverse(node->left);
if(pre){
result = min(result, abs(node->val - pre->val));
}
pre = node;
traverse(node->right);
}
int getMinimumDifference(TreeNode* root) {
traverse(root);
return result;
}
501.二叉搜索树中的众数,需二刷,理解双指针及如何求众数
vector<int> result;
TreeNode* prev;
int max_count = 0;
int count = 0;
void traverse(TreeNode* node){
if(node == nullptr) return;
traverse(node->left);
if(prev == nullptr){
count = 1;
}else if(prev->val == node->val){
count += 1;
}else{
count = 1;
}
prev = node;
if(count > max_count){
max_count = count;
result.clear();
result.push_back(node->val);
}else if (count == max_count){
result.push_back(node->val);
}
traverse(node->right);
}
vector<int> findMode(TreeNode* root) {
traverse(root);
return result;
}
236.二叉树的最长公共祖先,需二刷
//左右中后序遍历,回溯来实现由底向上遍历,找到公共祖先
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;
}else if(left == nullptr && right != nullptr){
return right;
}else if(left != nullptr && right == nullptr){
return left;
}else{
return nullptr;
}
}