当前位置:网站首页>Leetcode-112:路径总和
Leetcode-112:路径总和
2022-07-03 09:22:00 【ITSOK_U】
112. 路径总和
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。
如果存在,返回 true ;否则,返回 false 。叶子节点是指没有子节点的节点。
这道题和题257. 二叉树的所有路径十分类似,代码也相似。
深度优先(O(N),O(N))
在本题使用深度优先的话可以使用前序递归来模拟实现,但是在递归中需要处理的是每个节点的路径和的计算要确保不对其它的节点路径和计算造成影响,所以使用递归的话在其回溯过程会需要处理那些多余的叶节点。
如在上述的路径和计算中,第一条叶子节点的路径和计算为1+2+4,如果此时不满足要求,则需要进行回溯,所以要更新已有结果为1+2,使用递归的话可以完美的解决这种问题,如下面代码中的return就可以实现有效的回溯。
if(root->left == nullptr && root->right == nullptr){
if(num == target) falg = true;
// 否则继续递归
return;
}
具体解题代码如下:
class Solution {
public:
void findPath(TreeNode* root,int num,int target,bool &falg){
// 新加入了节点更新路径和
num += root->val;
// 到达叶子节点
if(root->left == nullptr && root->right == nullptr){
// 满足求解条件,结果标志为真
if(num == target){
falg = true;
}
// 否则继续递归
return;
}
// 左子树递归
if(root->left) findPath(root->left,num,target,falg);
// 右子树递归
if(root->right) findPath(root->right,num,target,falg);
}
bool hasPathSum(TreeNode* root, int targetSum) {
// 根节点为空,返回false
if(root == nullptr) return false;
// falg用来标记求解结果
bool falg = false;
findPath(root,0,targetSum,falg);
return falg;
}
};
广度优先(O(N),O(N))
使用广度优先的话就是模拟一次层序遍历。不过相比于普通的打印路径之类的求解,此时我们需要维护一个各个节点已有的路径和队列。如下图所示。我们的路径和队列是和树节点队列一一位置对应的,也就是说,与树节点队列相同位置的路径和队列的值就是到该树节点的路径和。
class Solution {
public:
bool hasPathSum(TreeNode* root, int targetSum) {
// 空树直接返回false
if(root == nullptr) return false;
// 初始化广度遍历的树节点队列
queue<TreeNode*> que;
queue<int> num;
que.push(root);
num.push(root->val);
// 队列不为空则节点未处理完
while(!que.empty()){
// 取出树节点队列以及路径和队列的首元素
TreeNode* node = que.front();
int res=num.front();
que.pop();
num.pop();
// 如果到了叶子节点而且路径和满足要求则直接跳出遍历,返回true
if(node->left==nullptr && node->right==nullptr && res==targetSum)
return true;
if(node->left){
que.push(node->left);
// 下一层节点入队,并将其对应的节点路径和存储
num.push(node->left->val + res);
}
if(node->right){
que.push(node->right);
// 下一层节点入队,并将其对应的节点路径和存储
num.push(node->right->val + res);
}
}
// 节点处理完仍然没有找到加和为targetSum的路径,返回false
return false;
}
};
边栏推荐
- One click generate traffic password (exaggerated advertisement title)
- 2. Elment UI date selector formatting problem
- Markdown latex full quantifier and existential quantifier (for all, existential)
- Stm32f407 key interrupt
- Swing transformer details-2
- RESNET code details
- Leetcode bit operation
- is_ power_ of_ 2 judge whether it is a multiple of 2
- 1. Finite Markov Decision Process
- YOLO_ V1 summary
猜你喜欢

One click generate traffic password (exaggerated advertisement title)

Open Euler Kernel Technology Sharing - Issue 1 - kdump Basic Principles, use and Case Introduction

ADS simulation design of class AB RF power amplifier

Notes on C language learning of migrant workers majoring in electronic information engineering

CV learning notes - camera model (Euclidean transformation and affine transformation)

Vgg16 migration learning source code

SCM is now overwhelming, a wide variety, so that developers are overwhelmed

There is no shortcut to learning and development, and there is almost no situation that you can learn faster by leading the way

MySQL root user needs sudo login

LeetCode - 5 最长回文子串
随机推荐
LeetCode - 895 最大频率栈(设计- 哈希表+优先队列 哈希表 + 栈) *
After clicking the Save button, you can only click it once
LeetCode - 1670 設計前中後隊列(設計 - 兩個雙端隊列)
YOLO_ V1 summary
ADS simulation design of class AB RF power amplifier
2021-10-28
2.Elment Ui 日期选择器 格式化问题
Drive and control program of Dianchuan charging board for charging pile design
QT is a method of batch modifying the style of a certain type of control after naming the control
The new series of MCU also continues the two advantages of STM32 product family: low voltage and energy saving
使用sed替换文件夹下文件
Windows下MySQL的安装和删除
Leetcode 300 最长上升子序列
自動裝箱與拆箱了解嗎?原理是什麼?
Opencv note 21 frequency domain filtering
Serial communication based on 51 single chip microcomputer
CV learning notes - feature extraction
On the problem of reference assignment to reference
Pycharm cannot import custom package
openEuler kernel 技术分享 - 第1期 - kdump 基本原理、使用及案例介绍