二叉树路径和
Posted 乐乐章
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树路径和相关的知识,希望对你有一定的参考价值。
- 二叉树路径的问题大致可以分为两类:https://leetcode.cn/problems/path-sum-iii/solution/yi-pian-wen-zhang-jie-jue-suo-you-er-cha-smch/
- 1、自顶向下:
- 思路:
- 1、如果是找路径和等于给定target的路径的,那么可以不用新增一个临时变量cursum来判断当前路径和,只需要用给定和target减去节点值,最终结束条件判断target==0即可
- 2、是否要回溯:二叉树的问题大部分是不需要回溯的,原因如下:二叉树的递归部分:dfs(root->left),dfs(root->right)已经把可能的路径穷尽了,因此到任意叶节点的路径只可能有一条,绝对不可能出现另外的路径也到这个满足条件的叶节点的;而对比二维数组(例如迷宫问题)的DFS,for循环向四个方向查找每次只能朝向一个方向,并没有穷尽路径,因此某一个满足条件的点可能是有多条路径到该点的并且visited数组标记已经走过的路径是会受到另外路径是否访问的影响,这时候必须回溯
- 3、找到路径后是否要return:取决于题目是否要求找到叶节点满足条件的路径,如果必须到叶节点,那么就要return;但如果是到任意节点都可以,那么必不能return,因为这条路径下面还可能有更深的路径满足条件,还要在此基础上继续递归
- 4、是否要双重递归(即调用根节点的dfs函数后,继续调用根左右节点的pathsum函数):看题目要不要求从根节点开始的,还是从任意节点开始
- 1、如果是找路径和等于给定target的路径的,那么可以不用新增一个临时变量cursum来判断当前路径和,只需要用给定和target减去节点值,最终结束条件判断target==0即可
- 437. Path Sum III(路径可以任意点开始,任意点结束)(前缀和不好理解)
- 思路:
新手算法学习之路----二叉树(二叉树的路径和)
题目: 给定一个二叉树,找出所有路径中各节点相加总和等于给定 目标值
的路径。
一个有效的路径,指的是从根节点到叶节点的路径。
代码加思路:
public List<List<Integer>> binaryTreePathSum(TreeNode root, int target) { List<List<Integer>> Result = new ArrayList<>(); List<Integer> path= new ArrayList<Integer>(); if(root == null){ return Result; } path.add(root.val); helper(Result, path,root.val,target,root); //这里的根节点的值我一开始忘记加了,这是我的一个错误 return Result; } private void helper(List<List<Integer>>Result, List<Integer>path, int sum, int target, TreeNode root){ if(root.left == null&&root.right == null){//判断已到达了叶子节点,如果到达了叶子节点的话还没有和sum相等的话那就放弃这个path数组 if(sum == target){ Result.add(new ArrayList<Integer>(path)); } return; } if(root.left!= null){ //左子树 path.add(root.left.val); helper(Result,path, sum+root.left.val, target,root.left); path.remove(path.size()-1); //这个remove的作用是,如果找到了sum==target的路径的话,由于每一在遍历左子树的时候就已经把每一个节点add到path数组里面了,在最后一个节点那里也已经将path值添加到了Result值里面了,所以要将path清空留个下一个右节点。同时要想合理的删除path里面的内荣最好的办法就是从后往前删,这是remove的一个弊端。 } if(root.right != null){ path.add(root.right.val); helper(Result,path,sum+root.right.val, target, root.right); path.remove(path.size()-1); } }
以上是关于二叉树路径和的主要内容,如果未能解决你的问题,请参考以下文章