【LeetCode501】【中序遍历】每日一题day25

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    void bianli(TreeNode *t, int &cmax, vector<int> &vmax, int &prev, int &cnt)
    {
        //printf("%d ", prev);
        if (t->left)
        {
            //prev = t->val;
            bianli(t->left, cmax, vmax, prev, cnt);
        }
        if (t->val == prev)
        {
            cnt++;
            if (cnt == cmax)
            {
                vmax.push_back(t->val);
            }
            else if (cnt > cmax)
            {
                cmax = cnt;
                vmax.clear();
                vmax.push_back(t->val);
            }
        }
        else
        {
            cnt = 1;
            if (cnt == cmax)
            {
                vmax.push_back(t->val);
            }
        }
        prev = t->val;
        if (t->right)
        {
            bianli(t->right, cmax, vmax, prev, cnt);
        }
    }
    vector<int> findMode(TreeNode* root) {
        int cmax = 1, cnt = 1;
        vector<int> vmax;
        if (root == NULL) return vmax;
        int prev = -1;
        bianli(root, cmax, vmax, prev, cnt);
        return vmax;
    }
};

没啥好说的啊,很裸的一个中序遍历,以后看到二叉搜索树就应该想到中序遍历递增这个性质。但是它虽然递增,相等的数在树上不一定挨在一起。
需要注意的是cmax、prev、cnt全都传了引用,他们都是你整棵树递归的全程都需要的变量,不只是某一次函数需要。不知道我说清楚了没,就是它是全程都需要的,所以不能只传递值,要不然你递归、回来、递归、回来就会出问题。

【不够…我每天学习时间还是太少了,效率太低,最近有好多好多杂七杂八的事情怎么办,一定会化繁为简集中精力学习的ᕙ༼ຈلﻝ͜ ຈ༽ᕗ】
【今天上程序设计实验课看到旁边的同学在手动实现字符串函数的一些功能,为char数组动态分配内存,有点像string。感觉他的学习路线和我完全不一样。他在很流畅地写代码实现功能,我好像从来没代码写那么顺溜过。对,原因是我总是不先在脑子里把它想清楚就下手写,这是需要改的。但是关于该做题还是该写些其他什么,我不知道】
【有点死皮赖脸地报名了一个老师的实验项目,看到同组的都是好厉害的同学我有点怯。怕我的实力够不上,但是绝对绝对会尽全力学东西,可能到了一天睡五六个小时喝咖啡度日的时候了吧quq希望 能真的学到东西】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值