程序员代码面试指南 3.6:二叉树中找累加和为指定值的路径

https://www.nowcoder.com/practice/2d35bc3364e3470381bc4eebd9178747

1、思路

  • 前序遍历的同时计算从根节点到当前节点路径之和,哈希表的键表示路径前缀和,值表示路径终点所在的层(因为路径只能由上自下);

  • 遍历过程中若在哈希表中找到curSum - targetSum,则表示已经找到一条累加和为指定值的路径,更新其路径长度;

  • 哈希表初始化hash[0] = 0,表示第0层的路径和为0

2、代码

#include <iostream>
#include <unordered_map>

using namespace std;

struct TreeNode
{
    int val;
    TreeNode *left, *right;
    TreeNode(int _val) : val(_val), left(nullptr), right(nullptr) {}
};

void createTree(TreeNode *root, int &n)     //建树
{
    if (n == 0) return;

    int fa, left, right, val;
    cin >> fa >> left >> right >> val;

    root->val = val;
    if (left != 0)
    {
        root->left = new TreeNode(left);
        createTree(root->left, -- n);
    }

    if (right != 0)
    {
        root->right = new TreeNode(right);
        createTree(root->right, -- n);
    }
}

int preOrder(TreeNode *root, int targetSum, int preSum, int level, int maxLen, 
             unordered_map<int, int> &hash)
{
    if (root == nullptr) return maxLen;

    int curSum = preSum + root->val;

    //若上层已有相同的curSum,则不更新,因为用上层的会使路径更长
    if (hash.find(curSum) == hash.end()) 
    {
        hash[curSum] = level;            //将当前层的curSum加入到哈希表中
    }

    if (hash.find(curSum - targetSum) != hash.end())
    {
        maxLen = max(maxLen, level - hash[curSum - targetSum]);
    }

    //继续遍历左右子树
    maxLen = max(preOrder(root->left, targetSum, curSum, level + 1, maxLen, hash), 
                 preOrder(root->right, targetSum, curSum, level + 1, maxLen, hash));

    if (hash[curSum] == level)          //回溯到上一层时,把当前层的curSum移除
    {
        hash.erase(curSum);
    }

    return maxLen;
}

int main()
{
    int n, fa;
    cin >> n >> fa;

    TreeNode *root = new TreeNode(0);
    createTree(root, n);

    int targetSum;
    cin >> targetSum;

    unordered_map<int, int> hash;
    hash[0] = 0;

    cout << preOrder(root, targetSum, 0, 1, 0, hash) << endl;

    return 0;
}

主要是为左程云的《程序员代码面试指南》这本书改写C++版的题解。

全部评论

相关推荐

07-25 10:17
仰恩大学 营销
bg双非,被挂了
投递拼多多集团-PDD等公司10个岗位
点赞 评论 收藏
分享
投递腾讯等公司10个岗位
点赞 评论 收藏
分享
白火同学:先说结论,准大三不是特别好找实习,boss沟通300+没有实习是很正常的情况。一是暑期实习时间太短了,二是在这么多准大四都找不到实习,从实习时间和掌握技术层面,企业会优先看他们。 再说简历,其实985本+准大三到这水平的简历也很优秀了,要说的话,项目经历可以再优化一下,可以基本围绕采取STAR原则,分为项目概述、技术架构、技术亮点、实现结果,再发给AI润色一下。 最后说操作,准大三的话,如果想找实习那就多投,不过现在也7月中旬了,时间上已经略晚了。如果7月底实在找不到,也可以多刷点算法,多学点技术,这实习也不至于一定得有,当然有更好。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务