栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Java&C++题解与拓展——leetcode508.出现次数最多得子树元素和【么的新知识】

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java&C++题解与拓展——leetcode508.出现次数最多得子树元素和【么的新知识】

每日一题做题记录,参考官方和三叶的题解

目录
  • 题目要求
  • 思路:DFS
    • Java
    • C++
    • Rust
  • 总结

题目要求

思路:DFS
  • 遍历整棵树,计算每一个节点的子树元素和,放入哈希表(去重+计数),同时记得维护一个最大值用以构造答案。

【论一道DFS模拟题怎么编出一段文字叙述的题解】

Java
class Solution {
    Map map = new HashMap<>();
    int maxv = 0;
    int DFS(TreeNode root) {
        // 遍历计算子树元素和
        if (root == null)
            return 0;
        int cur = root.val + DFS(root.left) + DFS(root.right);
        map.put(cur, map.getOrDefault(cur, 0) + 1);
        maxv = Math.max(map.get(cur), maxv); // 维护最大值
        return cur;
    }
    public int[] findFrequentTreeSum(TreeNode root) {
        DFS(root);
        // 构造答案
        List list = new ArrayList<>();
        for (int vlu : map.keySet()) {
            if (map.get(vlu) == maxv)
                list.add(vlu);
        }
        int n = list.size();
        int[] res = new int[n];
        for (int i = 0; i < n; i++)
            res[i] = list.get(i);
        return res;
    }
}
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)
C++
class Solution {
    unordered_map map;
    int maxv = 0;
public:
    int DFS(TreeNode *root) {
        // 遍历计算子树元素和
        if (root == nullptr)
            return 0;
        int cur = root->val + DFS(root->left) + DFS(root->right);
        map[cur] = map[cur] + 1;
        maxv = max(map[cur], maxv); // 维护最大值
        return cur;
    }
    vector findFrequentTreeSum(TreeNode* root) {
        DFS(root);
        // 构造答案
        vector res;
        for (auto &[vlu, cnt] : map) {
            if (cnt == maxv)
                res.push_back(vlu);
        }
        return res;
    }
};
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)
Rust
use std::rc::Rc;
use std::cell::RefCell;
use std::collections::HashMap;
impl Solution {
    fn DFS(root: Rc>, map: &mut HashMap) -> i32 {
        // 遍历计算子树元素和
        let cur = if root.borrow().left.is_none() && root.borrow().right.is_none() {
            root.borrow().val
        } else {
            let mut cur = root.borrow().val;
            if root.borrow().left.is_some() {
                let rl = root.borrow().left.clone().unwrap();
                cur += Solution::DFS(rl, map);
            }
            if root.borrow().right.is_some() {
                let rr = root.borrow().right.clone().unwrap();
                cur += Solution::DFS(rr, map);
            }
            cur
        };
        map.insert(cur, *map.get(&cur).unwrap_or(&0) + 1);
        cur
    }
    pub fn find_frequent_tree_sum(root: Option>>) -> Vec {
        let mut map = HashMap::new();
        Solution::DFS(root.unwrap(), &mut map);
		// 构造答案
        let mut maxv = 0;
        let mut res = vec![];
        map.iter().for_each(|(&vlu, &cnt)| {
            if cnt > maxv {
                maxv = cnt;
                res = vec![vlu]
            }
            else if cnt == maxv {
                res.push(vlu);
            }
        });
        res
    }
}
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)
总结

看到树了不来个DFS都说不过去,遍历顺便计算子树元素和,这题没想到卡在了Java的返回值,还要绕一步再构造数组。

又在rust的borrow、clone、unwrap各种里绕了半天。


欢迎指正与讨论!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/983444.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号