力扣(508.572)补7.19

发布于:2023-01-12 ⋅ 阅读:(633) ⋅ 点赞:(0)

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

感觉思路没问题,但编程老是报错(数组问题)。感觉数组问题是最难找错的,各种意想不到的错,太让人伤心了。

看的头大是因为一开始完全看不懂哈希,用结构体定义一个哈希节点,半猜半想能把思路理清楚,但代码还是有些难度。

这是我碰到的又一十分恶心的题,主要是有些细节不注意,又花我一整天去想哪里的bug,而且我的代码和标答高度一致都AC不了。

一个大问题是主函数中的maxcnt和cnt必须取其地址做为参数,dfs才能对齐修改,否则,dfs修改的是自己定义的形参,而不是实参。而且我试着把这2个参数用作全局变量,但还是有部分样例过不了。我实在不懂了。。。

#define MAX(a, b) ((a) > (b) ? (a) : (b))

typedef struct {

    int key;

    int val;

    UT_hash_handle hh;

} HashItem;

 

int dfs(struct TreeNode *node, HashItem **cnt, int *maxCnt) {

    if (node == NULL) {

        return 0;

    }

    int sum = node->val + dfs(node->left, cnt, maxCnt) + dfs(node->right, cnt, maxCnt);

    HashItem *pEntry = NULL;

    HASH_FIND_INT(*cnt, &sum, pEntry);

    if (NULL == pEntry) {

        pEntry = (HashItem *)malloc(sizeof(HashItem));

分配空间这一步容易忘。

        pEntry->key = sum;

        pEntry->val = 1;

        HASH_ADD_INT(*cnt, key, pEntry);

    } else {

        pEntry->val++;

    }

    *maxCnt = MAX(*maxCnt, pEntry->val);

    return sum;

}

 

int* findFrequentTreeSum(struct TreeNode* root, int* returnSize) {

    HashItem * cnt = NULL;

    int maxCnt = 0;

    dfs(root, &cnt, &maxCnt);

    unsigned int n = HASH_COUNT(cnt);

    int *ans = (int *)malloc(sizeof(int) * n);

    int pos = 0;

    for (HashItem *pEntry = cnt; pEntry; pEntry = pEntry->hh.next) {

        if (pEntry->val == maxCnt) {

            ans[pos++] = pEntry->key;

        }

    }

    HashItem *curr, *tmp;

    HASH_ITER(hh, cnt, curr, tmp) {

        HASH_DEL(cnt, curr);  

        free(curr);

    }

    *returnSize = pos;

    return ans;

}

 

572.另一颗树的子树

原来简单题对我来说就是答案理解简单而已么?代码照样想不出来。。。又是用的2个函数,每个函数里面都有递归。

Issametree判断2个树是否相同,issubtree的最后一步同时用了3个递归。很精妙。只有中间那个递归是真正判断是否有true,第1,3个递归是为了遍历所有结点,并让第二个递归返回答案。这个想法真的绝了。

这题也很容易读错,如果子树里有相同构造也不行,这里的子树是要包含本树的叶子结点的,不是从子树里再抠出一个结构来和subroot比较。

bool issametree(struct TreeNode*root,struct TreeNode*subroot){

    if(root==NULL&&subroot==NULL)

    return true;

    else if(root==NULL||subroot==NULL)

    return false;

    else if(root->val==subroot->val)

    return issametree(root->left,subroot->left)&&issametree(root->right,subroot->right);

    return false;

 

}

bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){

    if(root==NULL)

    return false;

    if(subRoot==NULL)

    return true;

    return isSubtree(root->left,subRoot)||issametree(root,subRoot)||isSubtree(root->right,subRoot);

}

 

 

 

 

 

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到