[Lc]112路径总和
Contents
题目
题解
二叉树结构如下:
//Definition for a binary tree node.
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
1. 递归法
- 时间复杂度: 最坏情况$O(N)$
- 空间复杂度: 最坏情况$O(N)$
//这道题也是遍历整个树,找符合题意的路径,若没有就返回false
class Solution {//两种方法。1.递归法
public:
bool hasPathSum(TreeNode* root, int sum) {
if(!root) return false;//若该节点为空,说明该路径所有节点之和未达到要求,返回false
if(!root->left && !root->right && root->val == sum) return true;//若路径之和等于sum,返回true
return hasPathSum(root->left, sum-root->val) || hasPathSum(root->right, sum-root->val);
//对左右子树递归
}
};
2. 队列迭代法(BFS宽度优先搜索)
- 时间复杂度: 最坏情况$O(N)$
- 空间复杂度: 最坏情况$O(N)$,这个比DFS慢一点。
//这道题也是遍历整个树,找符合题意的路径,若没有就返回false
class Solution {//两种方法。2.队列迭代法(这个方法会改变每个节点的数值,
public:
bool hasPathSum(TreeNode* root, int sum) {
if(!root) return false;//特殊情况
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){//当q不为空时继续迭代
auto cur = q.front();q.pop();//建立指针指向当前迭代的值
if(!cur->left && !cur->right && cur->val == sum) return true;
//若为叶节点,且叠加的叶节点值为sum,返回ture
if(cur->left){
cur->left->val += cur->val;
q.push(cur->left);
}//左子节点加入父节点的值,并压入队列
if(cur->right){
cur->right->val += cur->val;
q.push(cur->right);
}//右子节点同上
}
return false;//若未返回true,则全部遍历完成后返回false
}
};
3. 栈迭代法(DFS深度优先搜索)
这个写法和遍历的写法不太一样,要注意区分!
- 时间复杂度: 最坏情况$O(N)$
- 空间复杂度: 当树不平衡的最坏情况下是 $O(N)$ 。在最好情况(树是平衡的)下是 $O(\log N)$。
class Solution {//两种方法。3.栈迭代法,这是DFS(这个方法会改变每个节点的数值,
public:
bool hasPathSum(TreeNode* root, int sum) {
if(!root) return false;//特殊情况
stack <TreeNode*> s;
s.push(root);
while(!s.empty()){//当s不为空时继续迭代
auto cur = s.top();s.pop();//建立指针指向当前迭代的值
if(!cur->left && !cur->right && cur->val == sum) return true;
//若为叶节点,且叠加的叶节点值为sum,返回ture
if(cur->left){
cur->left->val += cur->val;
s.push(cur->left);
}//左子节点加入父节点的值,并压入栈
if(cur->right){
cur->right->val += cur->val;
s.push(cur->right);
}//右子节点同上
}
return false;//若未返回true,则全部遍历完成后返回false
}
};
Author ChrisHRZ
LastMod 2020-03-20