万得Wind 秋招 笔试题 附代码

题目:二叉树路径查找

给定一棵二叉树(结构如下),其中每个节点值为整数。给定一个值 K,求所有满足如下条件的路径并将路径 上节点的值打印出来: 1、路径方向必须向下,即只能从父节点指向子节点 2、路径并不是必须从根节点开始或在叶节点结束。即树上任意节点开始向下走到任意节点的路径都 允许。 3、路径上的节点得分之和等于给定值 K。节点得分=节点值+节点所在层(根节点为 0,之后每层+1)。

参考答案

#include <iostream>
#include <sstream>
#include <vector>
#include <queue>
#include <string>

using namespace std;

// 树的结构体
struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

//输出路径
void printPath(const vector<int>& path)
{
    for (int i = 0; i < path.size(); i++) {
        if (i != 0) cout << " ";
        cout << path[i];
    }
    cout << endl;
}

//根据序列构造树
TreeNode* buildTree(const vector<string>& nodes) {
    if (nodes.empty()) return nullptr;

    TreeNode* root = new TreeNode(stoi(nodes[0]));
    queue<TreeNode*> q;
    q.push(root);

    int i = 1;
    while (!q.empty()) {
        TreeNode* node = q.front();
        q.pop();

        if (i < nodes.size() && nodes[i] != "null") {
            node->left = new TreeNode(stoi(nodes[i]));
            q.push(node->left);
        }
        ++i;

        if (i < nodes.size() && nodes[i] != "null") {
            node->right = new TreeNode(stoi(nodes[i]));
            q.push(node->right);
        }
        ++i;
    }

    return root;
}

//从指定节点开始寻找路径,不一定是根节点
void findPath(TreeNode* node, int restSum , int depth, vector<int>& path, vector<vector<int>>& res) {
    if (!node) return;

    int new_sum = restSum - node->val - depth;
    path.push_back(node->val);

    // debug: 输出剩余的路径数目
    //cout << new_sum << "\t";
    //printPath(path);


    if (new_sum == 0) {
        res.push_back(path);
    }

    findPath(node->left, new_sum, depth + 1, path, res);
    findPath(node->right, new_sum, depth + 1, path, res);

    path.pop_back();
}

//递归从每个节点开始找
void findPathCurNode(TreeNode* root, int sum, vector<vector<int>>& res, int depth) {
    if (!root) return;

    vector<int> path;
    findPath(root, sum, depth, path, res);

    findPathCurNode(root->left, sum, res, depth+1);
    findPathCurNode(root->right, sum, res, depth + 1);
}


int main() {
    while (true) {
        cout << "input K and Tree:" << endl;

        int K; cin >> K;
        cin.ignore();

        string line; getline(cin, line);
        stringstream ss(line);

        vector<string> nodes;
        string node;
        while (ss >> node) nodes.push_back(node);

        TreeNode* root = buildTree(nodes);

        vector<vector<int>> res;
        findPathCurNode(root, K, res, 0);


        cout << endl << "output:" << endl;
        for (const auto& path : res) {
            printPath(path);
        }
        cout << endl;
    }
    


}

全部评论
和我实习二面笔试题目一样,然后就没后续了
2 回复
分享
发布于 11-21 15:34 江苏
哥太牛了
1 回复
分享
发布于 11-20 20:29 湖南
中国证券登记结算有限责任公司
校招火热招聘中
官网直投

相关推荐

先是自我介绍1、对于996的看法2、线程池的源码看过吗,能说说吗?(不知道怎么脑子抽了说锁相关的了解更多一点)3、知道哪些锁的底层原理?(说了Sync)4、sync的四种状态?(从无锁到重量级锁)5、四种状态下哪些可以访问系统资源?(真不知道……)6、怎么了解AQS的?7、volitile能锁住对象吗,作用是什么?8、几种垃圾回收的算法?9、常见的垃圾回收器?10、双亲委派机制?11、双亲委派的作用?12、B树和B+树的区别?13、B+树哪里用?14、一个表给a列加了索引,给了两个sql语句,一个是select&nbsp;*&nbsp;from&nbsp;xx&nbsp;…….&nbsp;like&nbsp;“abc%”,还有一个是like&nbsp;“%abc”,哪个走了索引?15、分布式情况下,sync和reentrantlock这些锁能否锁住资源?(给我问懵了…然后给自己挖坑说分布式有分布式锁啊)16、分布式锁怎么实现?(说了redis)17、redis实现分布式锁的加锁和设置什么(忘了)是否是原子性操作,怎么保证原子性?18、好像是问redis分布式锁出现的问题是如何解决的?(没说上来,但给自己挖坑说用Redisson)19、细问redisson(直接说不是很了解)20、缓存穿透有哪些解决方案?21、懒汉和饿汉的区别?(真忘了…)22、单例模式会有线程安全问题吗?(回答了双重校验锁)23、遇到高并发的问题应当如何处理?(开始胡诌,面试官对答案好像也不是很满意)24、问怎么限流(回答用sentinel,但具体细节不会)25、怎么做高可用(具体的问题记不太清了)反问:对我的建议。还行,但实战要加强面完一整个大寄特寄,确实是我太菜,问题比较基础,下次再努力……后续,面完给我发了笔试,我还以为我过了,结果笔试之后几天流程显示二面挂,说实话不太理解这波操作 #面试#&nbsp;&nbsp;#java#
点赞 评论 收藏
转发
头像
不愿透露姓名的神秘牛友
11-01 17:54
万得 Java 15.3 × 12 + (年终) 硕士211
点赞 评论 收藏
转发
9 12 评论
分享
牛客网
牛客企业服务