【剑指offer-C++】JZ34:二叉树中和为某一值的路径(二)
创始人
2025-05-28 23:19:12
0

【剑指offer-C++】JZ34:二叉树中和为某一值的路径(二)

    • 题目描述
    • 解题思路

题目描述

描述:输入一颗二叉树的根节点root和一个整数expectNumber,找出二叉树中结点值的和为expectNumber的所有路径。
1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点。
2.叶子节点是指没有子节点的节点。
3.路径只能从父节点到子节点,不能从子节点到父节点。
4.总节点数目为n。

如二叉树root为{10,5,12,4,7},expectNumber为22:

在这里插入图片描述

则合法路径有[[10,5,7],[10,12]]。

数据范围:
树中节点总数在范围 [0, 5000] 内。
-1000 <= 节点值 <= 1000。
-1000 <= expectNumber <= 1000。

输入:{10,5,12,4,7},22
返回值:[[10,5,7],[10,12]]
说明:返回[[10,12],[10,5,7]]也是对的 
输入:{10,5,12,4,7},15
返回值:[]
输入:{2,3},0
返回值:[]
输入:{1,3,4},7
返回值:[]

解题思路

二叉树中和为某一值的路径(二):最直观的想法是,从根节点依次从上向下从左向右直到叶子节点,一条路径一条路径的判断,当到达叶子节点时,如果满足要求则加入结果集,反之不满足要求则弹出叶子节点转向其父节点的下一条路径继续进行判断,如此反复直至所有路径遍历结束即可。整个遍历过程十分容易模拟,那么如何将模拟过程转化为代码呢?首先使用一个变量result记录整个结果集,使用一个变量path记录当前路径,为了方便起见,此处将这两个变量设置为全局变量。首先判断根节点root是否为空,如果为空则直接返回空的result,反之将根节点root和期待值expectNumber传入dfs函数。由于一进入dfs函数就需要将当前节点的值加入当前路径path中,故要保证当前节点不为空,该判断条件在进入dfs之前就进行判断即可,否则如果进入时允许节点为空,那么将节点值加入path就会很麻烦。当当前节点到达叶子节点,即当前节点的左右孩子均为空,且当前节点值等于期待值时,则表示当前路径满足条件,故将当前路径path加入结果集result中并返回即可,反之如果不等于,则直接返回即可。即dfs到达叶子节点即会返回,此时在左右孩子节点不为空的判断中,存在dfs函数被返回,一定要在紧跟着的dfs函数之后弹出叶子节点元素,这样再继续下一个方向的才对,否则答案会出错!注意:此处我是一遍历到节点就加入该节点的值到当前路径中,那么对应的叶子节点即是期待值减去当前值!

vector> result; //记录所有结果
vector path; //记录当前结果
void dfs(TreeNode* root,int expectNumber)
{//一进入递归就加入节点的值 故节点不为空 即在后续递归时判断是否为空path.push_back(root->val);//如果已经到达叶子结点并且叶子节点的值等于待求解值则加入结果集if(!root->left&&!root->right&&root->val==expectNumber){result.push_back(path);return; //返回}//该条路径不满足则直接返回if(!root->left&&!root->right&&root->val!=expectNumber){return; //返回}//左节点不为空才执行if(root->left){//如果左节点不为空 则待求解值等于当前值减去根节点值dfs(root->left,expectNumber-root->val);//一旦dfs返回 无论是满足条件加入结果返回 还是不满足结果直接返回 必定是到达叶子结点 此时弹出叶子节点即可 注意一定要先弹出再去遍历右边 否则容易出错path.pop_back();}//右节点不为空才执行if(root->right){//如果右节点不为空 则待求解值等于当前值减去根节点值dfs(root->right,expectNumber-root->val);//注意 result和path是全局变量!path.pop_back();}	
}
vector> FindPath(TreeNode* root,int expectNumber) 
{if(root==nullptr)return result;dfs(root,expectNumber);return result;
}

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...