501. 二叉搜索树中的众数
题意:
给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。
假定 BST 有如下定义:
结点左子树中所含结点的值小于等于当前结点的值
结点右子树中所含结点的值大于等于当前结点的值
左子树和右子树都是二叉搜索树
例如:
给定 BST [1,null,2,2]
,
1
\
2
/
2
返回[2]
.
题意:
这道题还是利用中序遍历,因为中序遍历相当于遍历一遍有序数组.然后找出里面最多的数即可
问 答 如何判断这个数的个数? 利用中序遍历,定义一个全局变量存储上一个值.再定义一个变量存储记录该值出现的个数. 如何判断这个数最多? 需要再定义一个全局来存储当前最多的个数. 如何完成存储? 如果这个数出现的个数比最多的还打,那么就重新构造一个数组.如果等于就加入数组.小于则不处理 坑🕳 因为没有遍历空节点,所以最后一个数字没办法比较.需要再退出递归后再比较一次
- 到这里就基本完成题目.只需要中序遍历然后记录个数,记录最大的即可.
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int max = 1; //记录数出现的次数
vector<int> res; //记录结果
int index = -1; //记录当前值,也就是上一个数
int num = 0; //记录目前最大的数
void findMax(TreeNode *root)
{
//中序遍历
if (root->left)
findMax(root->left);
//到中序遍历的第一个节点,让当前值为该节点的值
if (index == -1)
index = root->val;
//持续遍历
else
{
//看是否等于index,如果等于index说明是同一个数,那么就让个数加1
if (root->val == index)
max++;
//如果不等说明已经没有跟上一个数相等的了,就比较个数
else
{
//如果比当前最大的还大,直接新构造一个即可
if (max > num)
{
num = max;
res = vector<int>{index};
}
//如果相等就加入
else if (max == num)
res.push_back(index);
//个数重新置1,开始下一个数遍历
max = 1;
}
//记录当前值
index = root->val;
}
//中序遍历右节点
if (root->right)
findMax(root->right);
}
vector<int> findMode(TreeNode* root) {
if (!root)
return {};
findMax(root);
//因为最后一个没有进入循环,需要外面再比较一次
if (max > num)
res = vector<int>{index};
else if (max == num)
res.push_back(index);
return res;
}
};
总结:
利用二叉树中序遍历是一个有序数组的特点,用全局变量记录完成.记得出来还需要再判断一次