530.二叉搜索树的最小绝对差
题目链接/文章讲解: 代码随想录
class Solution {
public:
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; // 记录前一个
traversal(cur->right);
}
int getMinimumDifference(TreeNode* root) {
traversal(root);
return result;
}
};
首先可以使用递归法,按照中序遍历搜索二叉树就是一个递增的序列,想要得到最小绝对差的话就只需要比较前后两个节点即可,所以需要一个全局变量pre来记录当前节点的前一个节点。
501.二叉搜索树中的众数
class Solution {
private:
int count = 0;
int maxCount = 0;
TreeNode* pre = NULL;
vector<int> result;
void searchBST(TreeNode* cur) {
if (cur == NULL) return;
searchBST(cur->left);
if (pre == NULL) // 第一个节点
count = 1;
else if (pre->val == cur->val)
count++;
else count = 1;
pre = cur;
if (count == maxCount) { // 如果和最大值相同,放进result中
result.push_back(cur->val);
}
if (count > maxCount) {
maxCount = count;
result.clear();
result.push_back(cur->val);
}
searchBST(cur->right); // 右
return ;
}
public:
vector<int> findMode(TreeNode* root) {
count = 0;
maxCount = 0;
pre = NULL; // 记录前一个节点
result.clear();
searchBST(root);
return result;
}
};
由于这道题也是二叉搜索树,可以进行中序遍历,如果连续两个值相同,则说明这个值存在至少两次,count次数++。如果到了maxCount,就将result数组更新,再重新进行加载众数。
236. 二叉树的最近公共祖先
class Solution {
public:
TreeNode* travsel(TreeNode* node, TreeNode* p, TreeNode* q) {
if (node == NULL) return NULL;
if (node == p || node == q) return node;
TreeNode* left = travsel(node->left, p, q);
TreeNode* right = travsel(node->right, p, q);
if (left && right) return node;
if (!left && right) return right;
if (left && !right) return left;
return NULL;
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
TreeNode* result = travsel(root, p, q);
return result;
}
};
采用后序遍历,终止条件为遇到空或遇到目标节点,然后先后遍历左右节点。在处理当前节点时要先判断左右子树是否存在目标节点,若存在则返回目标接地,否则返回NULL