二叉搜索树中的众数-力扣

二叉搜索树的元素使用中序遍历,则可以得到一个有序的序列,那么判断前一个节点 和 当前节点的值是否相等,就可以统计一个数出现的次数,当一个数出现的次数大于当前的最大次数时,更新众数并清空之前的返回数组,添加新的众数进入数组。
这样就只需遍历一次,且无需使用map等容器耗费额外的空间。

/**
 * 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:
    void searchBST(TreeNode* root){
        if(root == nullptr){
            return;
        }
        searchBST(root->left);

        if(pre == nullptr){
            count = 1;
        }else if(pre->val == root->val){
            count++;
        }else{
            count = 1;
        }
        pre = root;

        if(count == maxCount){
            result.push_back(root->val);
        }else if(count > maxCount){
            maxCount = count;
            result.clear();
            result.push_back(root->val);
        }

        searchBST(root->right);
    }
    vector<int> findMode(TreeNode* root) {
      searchBST(root);
      return result;
    }
private:
    int count = 0;
    int maxCount = 0;
    TreeNode * pre = nullptr;
    vector<int> result;
};
<think>好的,我现在需要解决用户的问题,关于如何用Python实现求解众数,具体是《Python编程基础及应用》第2版习题6-1的要求。用户提到输入正整数直到-1,然后输出出现次数最多的数字。首先,我得先理解题目要求。 首先,题目需要用户输入一系列正整数,直到输入-1为止。然后统计这些数字中出现次数最多的那个,也就是众数。如果有多个众数,应该如何处理?题目没说,但通常可能需要全部输出或者取第一个。这里可能需要看教材里的具体例子或者要求,但用户没有说明,所以暂时假设输出其中一个即可,或者输出所有众数。不过习题可能要求输出出现次数最多的数字,如果有多个,可能按升序输出?或者只输出第一个遇到的?需要进一步确认。但用户提供的引用内容里没有相关信息,所以可能需要做一个合理的假设。 接下来,我需要考虑如何收集输入。用户需要持续输入,直到输入-1。所以可以用一个循环,不断读取输入,当输入为-1时停止。需要注意的是,输入的是正整数,所以应该过滤掉非正整数的情况吗?比如,如果用户输入0或者负数(除了-1),是否要处理?题目中说是输入正整数直到-1,所以可能只有正整数和-1会被处理。其他无效输入可能可以忽略,但习题可能假设输入都是正确的,所以可能不需要处理异常情况。 然后,统计每个数字出现的次数。这通常可以用字典来实现,键是数字,值是出现的次数。遍历输入的数字列表,每次遇到一个数字就增加对应的计数。 统计完次数后,需要找到最大的次数值,然后找出所有出现次数等于该值的数字。例如,如果有两个数字都出现了3次,而其他数字出现次数更少,那么这两个都是众数。此时可能需要将它们都输出。但根据用户提到的“输出出现次数最多的数字”,可能需要输出所有众数,或者按某种顺序输出。比如,题目可能要求输出最小的那个,或者按出现顺序,或者全部输出。但原题可能要求如果有多个,按升序输出?或者输出所有? 根据用户提供的引用内容,例如习题6-1,可能教材中的示例输出是什么样的?假设用户需要的是输出所有众数中的最大值,或者按输入顺序的第一个?或者升序排列后的结果?但用户没有给出具体例子,需要进一步假设。例如,在常见的众数问题中,如果有多个众数,通常会输出所有众数。或者可能题目要求输出其中一个,比如最大的那个。这里可能需要根据常见的处理方式来决定。 假设需要输出所有出现次数最多的数字,按升序排列输出。或者可能题目要求如果有多个,输出其中最大的或者最小的?或者按照出现的顺序?这里可能需要灵活处理。但根据常规做法,可能输出所有众数,并按升序排列。 现在,如何编写代码: 1. 读取输入直到-1:可以用循环,例如: nums = [] while True: num = int(input()) if num == -1: break if num > 0: # 因为题目说是正整数 nums.append(num) 这样收集所有输入的正整数。 2. 统计频率。可以用字典: count = {} for num in nums: if num in count: count[num] +=1 else: count[num] =1 或者使用collections模块中的Counter,可能更简洁: from collections import Counter count = Counter(nums) 但可能教材中希望用基础方法,所以可能不使用Counter,而是手动统计。 3. 找出最大的出现次数: max_count = max(count.values()) 4. 找出所有出现次数等于max_count的数字: modes = [k for k, v in count.items() if v == max_count] 然后,对modes进行排序或者处理,根据题目要求输出。例如,如果题目要求输出最小的众数,或者按升序输出所有。如果题目要求输出出现次数最多的数字中的任意一个,或者全部。例如,假设题目要求输出所有的众数,按升序排列,那么可以排序modes: modes.sort() print("众数为:", end='') for m in modes: print(m, end=' ') 或者,如果题目只需要输出其中一个,比如第一个遇到的,或者最大的,则取modes中的相应元素。 但根据常见的习题,可能如果存在多个众数,需要输出全部,可能按升序排列。例如,输入为1 2 2 3 3 -1,输出2和3,各出现两次,所以输出2 3。 现在,综合这些步骤,代码的大体结构应该如下: nums = [] while True: num = int(input("请输入正整数(输入-1结束):")) if num == -1: break if num > 0: nums.append(num) if not nums: print("没有输入数字") else: # 统计频率 count = {} for num in nums: if num in count: count[num] +=1 else: count[num] =1 # 找最大次数 max_count = max(count.values()) modes = [k for k, v in count.items() if v == max_count] # 排序 modes.sort() print("出现次数最多的数字是:", end='') print(' '.join(map(str, modes))) 这里需要考虑当输入为空的情况,比如用户一开始就输入-1,这时需要处理,避免max()出错。 但是,根据题目描述,用户需要输入正整数直到-1,所以至少可能输入一个数字,但也不能排除用户直接输入-1的情况,所以需要处理。 现在,关于代码是否正确。比如,假设输入为: 5 5 3 -1 统计结果中5出现两次,3出现一次,所以modes是5,正确。 另一个例子,输入:2 2 1 1 3 -1,count为2:2,1:2,3:1,modes是1和2,排序后输出1 2。 这样,代码应该可以正确运行。 但用户提供的引用中有一些代码,例如引用[1]中的代码: for i in range(len(a)): for j in range(1,len(a)): if a[i] > a[j]: s = (j-i) * a[j] else: s = (j-i)* a[i] t.append(s) t.append(s) print(max(t)) 这可能与当前问题无关,可能用户之前的问题是关于另一个问题的,但现在需要求解众数。因此,可能不需要考虑这部分代码。 另外,用户提到的引用[2]是关于统计整数数组取值次数的图表选择,这可能和当前问题无关,但用户当前的问题是关于众数计算的。 所以,综合以上分析,正确的代码应该是收集输入,统计频率,找到最高频率的数字,按升序输出所有众数。 可能教材中的习题要求输出所有众数,或者只输出其中一个?比如,假设题目示例输入是: 输入:5 1 5 3 5 -1 输出:5 或者如果有多个众数,例如输入:1 2 2 3 3 -1,输出2 3? 或者可能输出其中一个?这需要根据题目要求。但用户的问题中给出的输入输出示例可能更明确。但用户没有给出具体的例子,因此可能需要按照常规处理方式,即输出所有众数,按升序排列。 综上,代码的大致步骤是正确的,接下来需要验证是否有语法错误或逻辑错误。 比如,在处理输入的时候,是否应该将num转换为整数?是的,input()返回的是字符串,需要用int()转换。但如果用户输入非数字,会报错,但题目可能假设输入都是正确的,所以不需要处理异常。 另外,在判断num是否为正整数时,题目说是输入正整数,所以可能过滤掉非正数,但输入的只有正整数和-1,所以当num >0时才添加到nums列表中。 所以,代码中的判断是num>0,这样负数(除-1外)会被忽略,而0也会被忽略,因为0不是正整数。但题目可能允许输入0?题目描述是“输入正整数”,所以正确。 综上,代码应该可以正确运行,满足题目要求。</think>为了求解众数,我们可以通过以下步骤实现: 1. **读取输入**:持续输入正整数,直到输入`-1`时停止。 2. **统计频率**:使用字典记录每个数字的出现次数。 3. **确定众数**:找到出现次数最多的数字,若有多个则按升序输出。 ```python # 读取输入直到-1 nums = [] while True: num = int(input("请输入正整数(输入-1结束):")) if num == -1: break if num > 0: nums.append(num) if not nums: print("未输入有效数字") else: # 统计频率 frequency = {} for num in nums: if num in frequency: frequency[num] += 1 else: frequency[num] = 1 # 查找最大出现次数 max_count = max(frequency.values()) modes = [k for k, v in frequency.items() if v == max_count] # 按升序排列并输出 modes.sort() print("众数为:" + " ".join(map(str, modes))) ``` ### 代码说明 1. **输入处理**:通过循环读取输入,过滤非正整数(除`-1`外)。 2. **频率统计**:使用字典`frequency`记录每个数字的出现次数。 3. **众数提取**:找到最大出现次数对应的数字,排序后输出结果。 若输入为`5 5 3 5 -1`,输出为`5`;若输入为`2 2 1 1 -1`,输出为`1 2`[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值