leetcode刷题/二叉树 501. 二叉搜索树中的众数

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;
    }
};
总结:

利用二叉树中序遍历是一个有序数组的特点,用全局变量记录完成.记得出来还需要再判断一次

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

公仔面i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值