508. 出现次数最多的子树元素和-哈希表法纯c实现

508. 出现次数最多的子树元素和

给你一个二叉树的根结点 root ,请返回出现次数最多的子树元素和。如果有多个元素出现的次数相同,返回所有出现次数最多的子树元素和(不限顺序)。

一个结点的 「子树元素和」 定义为以该结点为根的二叉树上所有结点的元素之和(包括结点本身)。

示例 1:
在这里插入图片描述

输入: root = [5,2,-3]
输出: [2,-3,4]

示例 2:
在这里插入图片描述

输入: root = [5,2,-5]
输出: [2]

提示:

节点数在 [1, 104] 范围内
-105 <= Node.val <= 105

通过次数39,710
提交次数52,660

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */


/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
 int max;
 #define sized 100
void dfs1(struct TreeNode* root,int *size){
    if(root){
        (*size)++;
        dfs1(root->left,size);
           dfs1(root->right,size);
    }
}
int  dfs2(struct TreeNode* root,int *size,int *arr){
    if(root){
        int l=dfs2(root->left,size ,arr );
         int r=dfs2(root->right,size ,arr );

         arr[*size]=l+r+root->val;
         (*size)++;
         return l+r+root->val;
    }
    else{
        return 0;
    }
}
void quick(int *a,int low,int high){
    if(low<high){
        int l=low,h=high,p=a[low];
        while(low<high){
             while(low<high&&a[high]>=p){
                 high--;
            
                   }
           a[low]=a[high];
            while(low<high&&a[low]<=p){
                low++;
                
               }
               a[high]=a[low];

        }
         a[low]=p;
         quick(a,l,low-1);
         quick(a,low+1,h);
    }
}
struct hash{
    int val;
    int count;
    struct hash *next;
};

bool find_hash( struct hash *h,int val){
     struct hash *p=h->next;
     while(p){
         if(p->val==val){
             p->count++;
             if(p->count>max){
                 max=p->count;
             }
             return true;
         }
         p=p->next;
     }
     return false;
}

int* findFrequentTreeSum(struct TreeNode* root, int* returnSize){
    int *size=(int *)malloc(sizeof(int));
    *size=0;
    dfs1(root,size);
    *returnSize=*size;
    int *arr=(int *)malloc(sizeof(int)*(*size));
    *size=0;
    int re=dfs2(root,size,arr);
    int i;
    struct hash *h=(struct hash *)malloc(sizeof(struct hash )*sized);
    for(i=0;i<sized;i++){
       (h+i)->next=NULL;
    }
     max=1;

    for(i=0;i<*returnSize;i++){
        if(find_hash(h+abs(arr[i])%sized,arr[i])){
            continue;

        }
        else{
             struct hash *p=( struct hash *)malloc(sizeof( struct hash ));
             p->val=arr[i];
             p->count=1;
             p->next=(h+abs(arr[i])%sized)->next;
             (h+abs(arr[i])%sized)->next=p;
        }
        
    }
    int res=0;
     for(i=0;i<sized;i++){
         struct hash *p=(h+i)->next;
         while(p){
             if(p->count==max){
                 arr[res++]=p->val;

             }
             p=p->next;
         }
       
    }
    *returnSize=res;
  
    return arr;

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用哈希表来解决这个问题。遍历整个序列,将每个元素作为键,出现次数作为值存入哈希表中。然后遍历哈希表,找到出现次数最多元素即可。 具体步骤如下: 1. 创建一个空的哈希表。 2. 遍历整个序列,对于每个元素: a. 如果该元素已经在哈希表中,将其对应的值加1。 b. 如果该元素不在哈希表中,将其作为键,值设为1存入哈希表中。 3. 遍历哈希表,找到出现次数最多元素。 a. 初始化最大出现次数为,最多出现元素为空。 b. 对于哈希表中的每个键值对,如果该键对应的值大于最大出现次数,则更新最大出现次数最多出现元素。 4. 返回最多出现元素。 注意:如果有多个元素出现次数相同且都是最多出现次数,则返回其中任意一个即可。 ### 回答2: 对于求解一个序列中出现次数最多元素问题,我们可以使用哈希表来解决。具体步骤如下: 首先,需要遍历序列,将序列中每个元素及其出现次数记录到哈希表中。哈希表中的键为序列中的元素,值为元素在序列中出现次数。 接下来,遍历哈希表,找到值最大的键,即为出现次数最多元素。 具体实现中,可以用一个字典来作为哈希表实现,遍历序列时,对于每个元素,查看字典中是否存在该元素,如果存在,则将其对应的值增加1,否则将其添加到字典中,并将其对应的值初始化为1。 遍历完序列后,再对字典进行一次遍历,找到值最大的键,即为出现次数最多元素。 需要注意的是,当序列为空时,需要特殊处理,可以返回None或者抛出异常。此外,如果有多个元素出现次数相同,可以任选一个作为出现次数最多元素。 综上所述,使用哈希表是一种快速、简便且可靠的方法来解决求解一个序列中出现次数最多元素问题。 ### 回答3: 求解一个序列中出现次数最多元素问题,是一个经典的问题,也是数据结构中一个比较重要的问题。解决这个问题的方法有很多,下面将会介绍几种常见的方法。 首先,最简单的方法就是暴力枚举。我们可以用两层循环嵌套,分别遍历序列中每一个元素和它之后的元素,统计每个元素出现次数。时间复杂度是$O(n^2)$,因此仅适用于数据规模较小的情况。 其次,我们可以用哈希表来解决这个问题。我们可以用一个哈希表来记录每个元素出现次数,然后找到出现次数最多元素。时间复杂度是$O(n)$,空间复杂度是$O(n)$。 第三种方法是使用摩尔投票法。这个方法适用于出现次数最多元素超过数组长度的一半的情况。我们可以用一个候选元素和它出现次数来做比较,如果当前元素和候选元素相同,就增加计数器,否则就减少计数器。如果计数器变为0,就将下一个元素作为候选元素。时间复杂度是$O(n)$,空间复杂度是$O(1)$。 最后,我们可以使用堆来解决这个问题。我们可以用最大堆来维护每个元素出现次数,然后找到堆顶元素即可。时间复杂度是$O(nlogn)$,空间复杂度是$O(n)$。 综上所述,选择哪种方法来解决这个问题,需要根据具体的应用场景和数据规模来决定。对于数据规模较小的情况,可以使用暴力枚举或哈希表法;对于出现次数最多元素超过数组长度的一半的情况,可以使用摩尔投票法;对于数据规模较大的情况,可以使用堆来解决。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值