博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【重点】剑指offer——面试题25:二叉树中和为某一值的路径
阅读量:2254 次
发布时间:2019-05-09

本文共 2888 字,大约阅读时间需要 9 分钟。

剑指offer——面试题25:二叉树中和为某一值的路径

参考网址:

Solution1:

Solution2写法更标准一些!

/*struct TreeNode {    int val;    struct TreeNode *left;    struct TreeNode *right;    TreeNode(int x) :            val(x), left(NULL), right(NULL) {    }};*/class Solution {public:    vector
> buffer; vector
tmp; vector
> FindPath(TreeNode* root, int expectNumber) { if (root == NULL) return buffer; tmp.push_back(root->val); //如果是叶子结点,并且路径上结点和等于输入值 //打印这条路径 if ((expectNumber - root->val) == 0 && root->left==NULL && root->right==NULL) { buffer.push_back(tmp); } //如果不是叶节点,则遍历它的子节点 FindPath(root->left, expectNumber - root->val); FindPath(root->right, expectNumber - root->val); //在返回父结点之前,在路径上删除当前结点 if(tmp.size() != 0) tmp.pop_back(); return buffer; }};

Solution2:

教科书一样的DFS + Backtracking算法

注意和Solution3的细微差别,Solution3中没有backtracking的体现

/*struct TreeNode {    int val;    struct TreeNode *left;    struct TreeNode *right;    TreeNode(int x) :            val(x), left(NULL), right(NULL) {    }};*/class Solution {public:    vector
> FindPath(TreeNode* root,int expectNumber) { vector
> ret; vector
trace; if(root) dfs(root,expectNumber,ret,trace); return ret; } void dfs(TreeNode* root,int s,vector
> &ret,vector
&trace) { trace.push_back(root->val); if(!root->left&&!root->right) { if(s==root->val) ret.push_back(trace); } if(root->left) dfs(root->left,s-root->val,ret,trace); if(root->right) dfs(root->right,s-root->val,ret,trace); trace.pop_back(); }};

Solution3:

20180901重做

DFS经典套路题目

/*struct TreeNode {    int val;    struct TreeNode *left;    struct TreeNode *right;    TreeNode(int x) :            val(x), left(NULL), right(NULL) {    }};*/bool cmp(vector
&a, vector
&b) { return a.size() > b.size() ? true : false; }class Solution { public: vector
> FindPath(TreeNode* root,int expectNumber) { if (!root) return {}; vector
> res; vector
temp; int residual = expectNumber; my_DFS(root, residual, res, temp); sort(res.begin(), res.end(), cmp); return res; } void my_DFS(TreeNode *root, int residual, vector
> &res, vector
temp) { if (!root->left && !root->right) { //到达叶子结点 if (residual == root->val) { temp.push_back(root->val); res.push_back(temp); } return; } else { //一般情况 temp.push_back(root->val); if (root->left) my_DFS(root->left, residual - root->val, res, temp); if (root->right) my_DFS(root->right, residual - root->val, res, temp); } }};

转载地址:http://cxhdb.baihongyu.com/

你可能感兴趣的文章
UE4(虚幻4)基础:免费资源下载(材质/动作/模型/环境/效果/插件)
查看>>
UE4(虚幻4)基础:人物/动画导入与角色蓝图
查看>>
C++各容器特性总结
查看>>
C++人该知道的N个问题与做法:确保对象被使用前已先初始化
查看>>
排序算法--计数排序--详解实例与代码
查看>>
网络基础--学网络该学什么?(简单介绍 )
查看>>
设计模式--策略模式示例代码
查看>>
设计模式--命令模式示例代码
查看>>
生产服务器上安装Python
查看>>
centos--软件源--本地软件源---离线安装
查看>>
vue入门学习笔记
查看>>
MySQL数据库优化
查看>>
DataWorks(数据工场)
查看>>
shell运算符截取
查看>>
162. Find Peak Element【java】
查看>>
【java】234. Palindrome Linked List
查看>>
【java】747. Largest Number At Least Twice of Others
查看>>
【java】521. Longest Uncommon Subsequence I
查看>>
【java】849. Maximize Distance to Closest Person
查看>>
【java】559. Maximum Depth of N-ary Tree
查看>>