【二叉树】二叉搜索树中的众数

解题思路:递归解决

递归结束条件:传入结点为空结点

  1. 中序遍历二叉搜索树,用一个pre结点记录之前浏览的结点
  2. 分为三种情况:
    1. 第一次记录结点出现频率,此时pre为NULL,count设置为1
    2. 当前结点node值与pre所记录值一样,count+1
    3. 当前结点node值与pre所记录值不一样,count设置为1
  3. 之后将count与之前所出现过的最大频率结点进行比较:
    1. 如果count值与最大频率一样(有多个众数),将该结点压入数组
    2. 如果count值比最大频率大(证明当前结点应为众数),更新最大频率为当前count值。然后清空数组,将当前结点node值压入数组
struct TreeNode* pre;
int count;
int maxCount;

void searchBST(struct TreeNode* node, int* returnSize, int* ret) {
    if(!node)
        return ;
    searchBST(node->left, returnSize, ret);

		//pre为NULL时证明node为根节点
    if(pre == NULL) {
        count = 1;
    } 
		//当pre的值和node的值一样时,让count++
		else if(pre->val == node->val) {
        count++;
    } 
		//最后一种情况为pre和node的值不一样,这时候我们的count需要为1
		else {
        count = 1;
    }
    pre = node;

		//如果当前值的count值和最大count值一样,我们将值压入数组
    if(count == maxCount) {
        ret[(*returnSize)++] = node->val;
    }

		//如果发现了count比当前最大count值更大的情况,将maxCount更新。然后将数组清空。将最新元素压入数组
    else if(count > maxCount) {
        maxCount = count;
        *returnSize = 0;
        ret[(*returnSize)++] = node->val;
    }
    searchBST(node->right, returnSize, ret);
    return;
}

int* findMode(struct TreeNode* root, int* returnSize){
    *returnSize = 0;
    count = 0;
    maxCount = 0;
    pre = NULL;
    int* ret = (int*)malloc(sizeof(int) * 10240);
    searchBST(root, returnSize, ret);

    return ret;
}