zoukankan      html  css  js  c++  java
  • leet code 1302. 层数最深叶子节点的和

    先看题目:

    给你一棵二叉树,请你返回层数最深的叶子节点的和。
    示例:
    输入:root = [1,2,3,4,5,null,6,7,null,null,null,null,8] 输出:15   提示: 树中节点数目在 1 到 10^4 之间。 每个节点的值在 1 到 100 之间。

    看到题目一定要审题啊! 审题啊! 审题啊!,重要的事情说三遍,代码写完了突然发现结果怎么不对,哎,都是泪,题目要求很简单,找到最深的叶子节点的值的,首先输入是一个二叉树,我首先想到的是用递归来遍历,找到最深的叶子结点,但是我们怎么存储某一深度的叶子结点的和呢,毕竟在没有遍历完前我们还不知道它是不是最深的,我首先想到的是定义一个unordered_map来存储每一个深度的叶子结点的和,还有一种方法就是只存储最深的叶子结点对应的值得和,如果找到更深的就更新,如果找到相等的就加到这个值上,貌似我的定义map的方法更消耗内存了,这个优化很简单,上我的代码:

    class Solution {
    public:
        int deepestLeavesSum(TreeNode* root) {
            if (root == NULL) {
                return 0;
            }
            int max_depth = 0;
            int cur_depth = 0;
            unordered_map<int, int> depth_sum_map; // 层数,相同层数的叶子结点的和
    
            searchEndNode(root, cur_depth, max_depth, depth_sum_map);
    
            auto itr = depth_sum_map.find(max_depth);
    
            if (itr == depth_sum_map.end()) {
                return -1;
            }
            return itr->second;
        }
    
        void searchEndNode(TreeNode* root, int cur_depth, int& max_depth, unordered_map<int, int>& depth_sum_map) {
            cur_depth++; // 别的不管 把这一层层数加上
    
            if (root->left == NULL && root->right == NULL) { // 判断是叶子结点
                if (cur_depth > max_depth) {  //如果比最大深度大,更新最大深度
                    max_depth = cur_depth;
                }
                auto itr = depth_sum_map.find(cur_depth);
                if (itr == depth_sum_map.end()) { //查找是否已经有此深度的节点,如果没有,插入此深度和其对应的叶子结点值
                    // depth_sum_map[cur_depth] = root->val;
                    depth_sum_map.insert(pair<int, int>{cur_depth, root->val});
                }
                else {
                    itr->second+=root->val;  // 如果已经有了,增加此结点的值
                }
                return;
            }
    
            if (root->left != NULL) { // 左子节点存在
                searchEndNode(root->left, cur_depth, max_depth, depth_sum_map);
            }
            if (root->right != NULL) { // 右子节点存在
                searchEndNode(root->right, cur_depth, max_depth, depth_sum_map);
            }
                
            return;
        }
    };

    多说一句,细节决定成败,这个代码我写了一个小时,总结下来就是理解题目错误耗时20分钟,遍历代码不熟悉导致耗时20分钟(这里要讲一下就是二叉树迭代结束条件是找到了叶子结点,即没有左右子节点,多写几次就熟悉了),最后答案老是不对,找bug耗时20分钟,最后发现是一个赋值等号写成了判断相等的符号,细节决定成败!!!!!!!!

    稍微优化了下代码,不存储那么多和了:

    class Solution {
    public:
        int deepestLeavesSum(TreeNode* root) {
            if (root == NULL) {
                return 0;
            }
            int max_depth = 0;
            int cur_depth = 0;
            // unordered_map<int, int> depth_sum_map; // 层数,相同层数的叶子结点的和
            int max_sum = 0;
    
            searchEndNode(root, cur_depth, max_depth, max_sum);
            return max_sum;
        }
    
        void searchEndNode(TreeNode* root, int cur_depth, int& max_depth, int& max_sum) {
            cur_depth++;
    
            if (root->left == NULL && root->right == NULL) { // 如果是叶子结点
                if (cur_depth > max_depth) {  //如果比最大深度大,更新最大深度
                    max_depth = cur_depth;
                    max_sum = root->val;
                }
                else if (cur_depth == max_depth) {
                    max_sum += root->val;
                }
               
                return;
            }
    
            if (root->left != NULL) {
                searchEndNode(root->left, cur_depth, max_depth, max_sum);
            }
            if (root->right != NULL) {
                searchEndNode(root->right, cur_depth, max_depth, max_sum);
            }
                
            return;
        }
    };
  • 相关阅读:
    vue引用js报错Uncaught SyntaxError: Unexpected token <
    VS Code离线安装扩展方法
    zTree、jsTree排序和简单的js数字字符串混合排序方法
    C# 如何读取匿名类型Anonymous Type的属性
    ajax使用jsonp请求方式
    VS2015 Bad Request解决方法
    C# json对象中包含数组对象时,如何存入数据库
    js 最短代码生成随机数(字符串、id)
    HDU 6395 Sequence 杜教板子题
    hdu GuGuFishtion 6390 数论 欧拉函数
  • 原文地址:https://www.cnblogs.com/rulin/p/13022613.html
Copyright © 2011-2022 走看看