查看: 4388| 回复: 3
跳转到指定楼层
上一主题 下一主题
收起左侧

[其他] path sum 类型题目总结

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
1 直上直下
1.1 从上往下 (先处理当前node, 再处理它的左右)
1.1.1 root (包含) 到 Leaf (包含)   
特点:不管怎么样都要加上当前节点    即  sum += root.val;
只有走到叶子节点才需要处理:更新max[0]或者判断是否=target

( a )  找 max path

void maxPath(TreeNode root, int sum, int[] max) {
if (root == null) return;
sum += root.val;
if (root.left == null && root.right == null) {
  max[0] = Math.max(sum, max[0]);
  return;
}
maxPath(root.left, sum, max);
maxPath(root.right, sum, max);
}

( b )  找 path sum == target

leetcode path sum

boolean hasPathSum(TreeNode root, int sum) {
          if (root == null) return false;
          if (root.left == null && root.right == null) {
              return sum == root.val;
          }
         return hasPathSum(root.left, sum - root.val) || hasPathSum(root.right, sum - root.val);
     }

leetcode path sum II
void pathSumHelper(TreeNode root, int sum, int target, List<Integer> list, List<List<Integer>> res) {
          if (root == null) return;
          sum += root.val;
          list.add(root.val);
          if (root.left == null && root.right == null) {
             if (sum == target) {
                  res.add(new ArrayList<>(list));
             }
         }
        pathSumHelper(root.left, sum, target, list, res);
        pathSumHelper(root.right, sum, target, list, res);
        list.remove(list.size() - 1);
    }
}





1.1.2 root 到 Leaf 所在的path,可以不是root/Leaf  
特点:不同于1.1.2   只有sum >= 0时  sum += root.val;   
如果 sum < 0   sum 重新开始  sum = root.val;
              每走一步都需要处理:更新max[0]

( a )  找 max path
void maxPath(TreeNode root, int sum, int[] max) {
  if (root == null) return;
  if (sum < 0) sum = root.val;
  else sum += root.val;
  max[0] = Math.max(sum, max[0]);
  maxPath(root.left, sum, max);
maxPath(root.right, sum, max);
}


1.1 从下往上  (先处理它的左右, 再把左右返回的值给当前node处理)

root 到 Leaf 所在的path,可以不是root/Leaf  

( a )  找 max path

int maxPath(TreeNode root, int[] max) {
if (root == null) return 0;
int left = maxPath(root.left, max);
left = left > 0 ? left : 0;
int right = maxPath(root.right, max);
right = right > 0 ? right : 0;
max[0] = Math.max(Math.max(left, right) + root.val, max[0]);
return Math.max(left, right) + root.val;
}

2 非线性
any node to any node  
不同于上面root 到 Leaf 所在的path: 更新max[0]时可以是人字形,所以left + right + root.val,  其他一模一样
( a )  找 max path  (leetcode 124)
       
int maxPath(TreeNode root, int[] max) {
if (root == null) return 0;
int left = maxPath(root.left, max);
left = left > 0 ? left : 0;
int right = maxPath(root.right, max);
right = right > 0 ? right : 0;
max[0] = Math.max(left + right + root.val, max[0]);
return Math.max(left, right) + root.val;
}


求大米~       



评分

参与人数 15大米 +71 收起 理由
水锦鲤 + 1 给你点个赞!
tang529 + 1 赞一个
hanroro + 1 赞一个
iverson52000 + 2 很有用的信息!
williamshi + 3 给你点个赞!

查看全部评分


上一篇:求租leetcode 最好有两三个月
下一篇:学习语言一点心得
全局:
赞啊!
我最近也在准备总结这一块儿!
回复

使用道具 举报

🔗
水锦鲤 2019-10-19 10:44:42 | 只看该作者
全局:
能分析一下时间复杂度么?
回复

使用道具 举报

🔗
 楼主| blue_epoch 2019-10-19 14:10:37 | 只看该作者
全局:
水锦鲤 发表于 2019-10-19 10:44
能分析一下时间复杂度么?

遍历了整个树,所以时间复杂度是O(n), n是节点数;因为调用了递归,所以空间复杂度是O(h),h是数的高度。如果是balanced tree, 空间复杂度是 O(logn)。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表