当前位置:首页 » 《随便一记》 » 正文

112. 路径总和

20 人参与  2022年11月27日 12:25  分类 : 《随便一记》  评论

点击全文阅读


文章目录

2.示例3.答案①递归②BFS③DFS
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。

叶子节点 是指没有子节点的节点。

2.示例

在这里插入图片描述

输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22输出:true解释:等于目标和的根节点到叶节点路径如上图所示。
输入:root = [], targetSum = 0输出:false解释:由于树是空的,所以不存在根节点到叶子节点的路径。

3.答案

①递归

注意第二个示例,当结点为空时认为不存在路径返回false;
可以使得参数 targetSum等于当前路径上为了凑出targetSum还差的数值。

停止条件:
结点为空时返回false, 当前结点为叶子结点且val=targetSum(刚好凑出targetSum) 返回true。
递归内容: 在左孩子上查找,在右孩子上查找
返回值: 左右孩子查找结果的或

 bool hasPathSum(TreeNode* root, int targetSum) {          //尝试递归,将taargetsum看做还差的值        if(!root) return false;//空指针,检查路径时,不能把节点为空当做一种        if(!root->left&&!root->right) return targetSum==root->val;  //叶子结点,把这个当做递归的退出条件之一         return hasPathSum(root->left,targetSum-root->val)||hasPathSum(root->right,targetSum-root->val);

②BFS

层次遍历中,可以一层一层检查,每次保存当前结点和当前路径所有节点和.

 bool hasPathSum(TreeNode* root, int targetSum) {         if(!root) return false;//空指针,检查路径时,不能把节点为空当做一种        queue<TreeNode*> qt;        queue<int> qi;        qt.push(root);         qi.push(root->val);        while(!qt.empty()){             TreeNode* tmp=qt.front();  //取出当前结点            qt.pop();            int val=qi.front();  //当前路径和            qi.pop();              if(!tmp->left&&!tmp->right) {   //当前为叶子结点                if(targetSum==val) return true;                continue;            }            if(tmp->left) qt.push(tmp->left),qi.push(val+tmp->left->val);            if(tmp->right) qt.push(tmp->right),qi.push(val+tmp->right->val);        }        return false;

③DFS

深度优先遍历同样,每次保存当前结点和当前结点路径和。

 bool hasPathSum(TreeNode* root, int targetSum) {  if(!root) return false;        /深度优先  ,每次都是一条路径和        stack<TreeNode*> st;        stack<int> si;        st.push(root);         si.push(root->val);        while(!st.empty()){             TreeNode* tmp=st.top();  //取出当前结点            st.pop();            int val=si.top();            si.pop();              if(!tmp->left&&!tmp->right) {   //当前为叶子结点                if(targetSum==val) return true;                continue;            }            if(tmp->left) st.push(tmp->left),si.push(val+tmp->left->val);            if(tmp->right) st.push(tmp->right),si.push(val+tmp->right->val);        }        return false;    }

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/path-sum


点击全文阅读


本文链接:http://zhangshiyu.com/post/49113.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1