今日算法(二叉树)

cpp 复制代码
class Solution {
public:
    void Traversal(TreeNode* root, unordered_map<int, int>& m) {
        if (root == nullptr) return;
        m[root->val]++;
        Traversal(root->left, m);
        Traversal(root->right, m);
    }

    vector<int> findMode(TreeNode* root) {
        unordered_map<int, int> m;
        Traversal(root, m);
        
        // 找最大出现次数(正确遍历 map)
        int maxCount = 0;
        for (auto& pair : m) {
            maxCount = max(maxCount, pair.second);
        }

        // 收集所有众数
        vector<int> res;
        for (auto& pair : m) {
            if (pair.second == maxCount) {
                res.push_back(pair.first);
            }
        }

        return res;
    }
};

递归使用map存放出现的次数,然后进行遍历放入数组中,时间复杂度为O(N)

cpp 复制代码
class Solution {
public:
int count,maxcount;
TreeNode*pre=nullptr;
vector<int> vec;

void searchBST(TreeNode*root)
{
    if(root==NULL) return;
    searchBST(root->left);

//因为是二叉搜索树,所以都是邻近比较
     if(pre==NULL)
     {
        count=1;
     }
     else if(pre->val==root->val)
     {
        count++;
     }
     else//重新值一
     {
        count=1;
     }

     pre=root;

     if(count==maxcount)//目前的最大值插入
     {
        vec.push_back(root->val);
     }

     if(count>maxcount)
     {
        maxcount=count;
        vec.clear();//之前的值都作废
        vec.push_back(root->val);
     }

     searchBST(root->right);
     return;
}

    vector<int> findMode(TreeNode* root) {
        //使用前后指针进行记录大小,进行替换
        count=0;
        maxcount=0;
        pre=NULL;
vec.clear();
searchBST(root);
return vec;
    }
};

使用前后指针进行记录。

下面是迭代法

cpp 复制代码
class Solution {
public:
    vector<int> findMode(TreeNode* root) {
        stack<TreeNode*> st;
        TreeNode* cur = root;
        TreeNode* pre = NULL;
        int maxCount = 0; // 最大频率
        int count = 0; // 统计频率
        vector<int> result;
        while (cur != NULL || !st.empty()) {
            if (cur != NULL) { // 指针来访问节点,访问到最底层
                st.push(cur); // 将访问的节点放进栈
                cur = cur->left;                // 左
            } else {
                cur = st.top();
                st.pop();                       // 中
                if (pre == NULL) { // 第一个节点
                    count = 1;
                } else if (pre->val == cur->val) { // 与前一个节点数值相同
                    count++;
                } else { // 与前一个节点数值不同
                    count = 1;
                }
                if (count == maxCount) { // 如果和最大值相同,放进result中
                    result.push_back(cur->val);
                }

                if (count > maxCount) { // 如果计数大于最大值频率
                    maxCount = count;   // 更新最大频率
                    result.clear();     // 很关键的一步,不要忘记清空result,之前result里的元素都失效了
                    result.push_back(cur->val);
                }
                pre = cur;
                cur = cur->right;               // 右
            }
        }
        return result;
    }
};
相关推荐
纪念 22910 分钟前
C++算法(六)
开发语言·c++·算法
ShineWinsu39 分钟前
对于Qt:QCheckBox常见属性的详细解析
c++·qt·面试·笔试·gui·qcheckbox·多选框
Dumbness1 小时前
UIA 读微信群消息没有 id,怎么判断哪条是新的:后缀对齐在翻历史和撤回时整屏重报
python·算法
taka1 小时前
从 24x 到 141x:我用纯 Python 零依赖项目,扒开了 GPU 加速的性能黑洞
算法
AI的探索之旅1 小时前
97 个 OpenCV 实例(三十七):二维码识别,一张图四个码的陷阱
c++·opencv·计算机视觉
UIU1142 小时前
P16237 [蓝桥杯 2026 省 B] 应急布线
数据结构·c++·算法·蓝桥杯
raindayinrain2 小时前
c++设计模式
开发语言·c++·设计模式
旖旎夜光2 小时前
LeetCode 315: 算右侧小于当前元素的个数(归并排序) —— 题解
c++·学习·算法·leetcode·排序算法
像风一样自由20202 小时前
2.如何用FastAPI把一个Python算法封装成HTTP服务
python·算法·fastapi
D e re k ZH2 小时前
保序回归:从 PAVA 到可并堆的单调约束优化
c++·算法·数据挖掘·回归·kotlin