一、530.二叉搜索树的最小绝对差
注意要体会双指针的思想。
代码如下:
class Solution {
private:
int result = INT_MAX;
TreeNode* pre = NULL;
void traversal(TreeNode* cur) {
if (cur == NULL) return;
traversal(cur->left);
if (pre != NULL) {
result = min(result, cur->val - pre->val); // 二叉搜索树后一个节点一定比前一个节点大
}
pre = cur; // pre移动到cur位置
traversal(cur->right);
}
public:
int getMinimumDifference(TreeNode* root) {
traversal(root);
return result;
}
};
二、501.二叉搜索树中的众数
代码如下:
class Solution {
private:
int count;
int maxCount;
TreeNode* pre;
vector<int> result;
void traversal(TreeNode* cur) {
if (cur == NULL) return;
//左
traversal(cur->left);
// 中
// 对树的双指针处理
if (pre == NULL) count=1; // 第一个节点
else if (pre->val == cur->val) { // pre和cur值相等,count+1
count++;
}
else { //pre和cur值不相等,count重新变为1
count = 1;
}
pre = cur; // 更新pre,走cur走过的路
// 对结果集的处理
if (count == maxCount) { // 如果count和最大值相同,将其放入result
result.push_back(cur->val);
}
if (count > maxCount) { // 如果count大于最大值,说明之前依赖maxCount收集的result不是正确的结果集
maxCount = count; // 更新maxCount的值
result.clear(); // 清空之前的结果集
result.push_back(cur->val);
}
// 右
traversal(cur->right);
}
public:
vector<int> findMode(TreeNode* root) {
count = 0;
maxCount = 0;
TreeNode* pre = NULL;
result.clear(); // 不加也能通过
traversal(root);
return result;
}
};
三、236.二叉树的最近公共祖先(要复习)
代码如下:
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if (root == p || root == q || root == NULL) return root;
TreeNode* left = lowestCommonAncestor(root->left, p, q);
TreeNode* right = lowestCommonAncestor(root->right, p, q);
if (left != NULL && right != NULL) return root;
if (left == NULL && right != NULL) return right;
if (left != NULL && right == NULL) return left;
else {
return NULL;
}
}
};