训练营打卡Day21
文章目录
题52:530. 二叉搜索树的最小绝对差
思路
- 迭代中序遍历
- 取pre节点与cur,计算绝对差
- 比较绝对差是否为最小
代码
class Solution {
public:
int ans = INT_MAX;
TreeNode* pre = nullptr;
void traversal(TreeNode* root)
{
if(!root) return;
traversal(root->left);
if(pre)
{
ans = min(abs(pre->val - root->val), ans);
}
pre = root;
traversal(root->right);
}
int getMinimumDifference(TreeNode* root) {
traversal(root);
return ans;
}
};
题53:501. 二叉搜索树中的众数
思路
- 迭代中序遍历
- 遍历过程中记录当前节点的值和前一个节点的值,如果当前节点的值和前一个节点的值相同,则将计数器count加1,否则将计数器重置为1。
- 接着,比较当前计数器的值和历史最大计数器的值
- 如果当前计数器的值大于历史最大计数器的值,则将历史最大计数器的值更新为当前计数器的值,并将答案数组清空,将当前节点的值加入答案数组中。
- 如果当前计数器的值等于历史最大计数器的值,则将当前节点的值加入答案数组中
- 最后,将当前节点设为前一个节点,并继续遍历右子树。
代码
class Solution {
public:
int count = 0;
int maxCount = INT_MIN;
vector<int>ans;
TreeNode* pre = nullptr;
void traversal(TreeNode* root)
{
if(!root) return;
traversal(root->left);
if(!pre || pre->val != root->val)
count = 1;
else
count++;
if(maxCount < count)
{
maxCount = count;
ans.clear();
ans.push_back(root->val);
}
else if(maxCount == count)
{
ans.push_back(root->val);
}
pre = root;
traversal(root->right);
}
vector<int> findMode(TreeNode* root) {
traversal(root);
return ans;
}
};
题54:236. 二叉树的最近公共祖先
思路
左子树和右子树进行递归调用,以找到公共祖先节点。
-
首先,判断当前节点是否为空,或者是否为所查找的节点之一,如果是,则直接返回当前节点。
-
接着,调用递归函数分别查找当前节点的左子树和右子树中是否存在所查找的节点之一。如果左子树或右子树中有一个节点存在,则返回该节点;如果左右子树均存在所查找的节点之一,则返回当前节点。
-
在主函数中,调用递归函数即可得到所查找的两个节点的最近公共祖先。
代码
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(!root || root == p || root == q) return root;
auto left = lowestCommonAncestor(root->left, p, q);
auto right = lowestCommonAncestor(root->right, p, q);
if(!left) return right;
if(!right) return left;
return root;
}
};