2022-2-21 剑指offer day11
题1:
JZ82 二叉树中和为某一值的路径(一)
描述
给定一个二叉树root和一个值 sum ,判断是否有从根节点到叶子节点的节点值之和等于 sum 的路径。
1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点
2.叶子节点是指没有子节点的节点
3.路径只能从父节点到子节点,不能从子节点到父节点
4.总节点数目为n
例如:
给出如下的二叉树,\ sum=22 sum=22,
返回true,因为存在一条路径 5\to 4\to 11\to 25→4→11→2的节点值之和为 22
数据范围:
1.树上的节点数满足 0 \le n \le 100000≤n≤10000
2.每 个节点的值都满足 |val| \le 1000∣val∣≤1000
要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)
进阶:空间复杂度 O(树的高度)O(树的高度),时间复杂度 O(n)O(n)
1 import java.util.*; 2 3 /* 4 * public class TreeNode { 5 * int val = 0; 6 * TreeNode left = null; 7 * TreeNode right = null; 8 * } 9 */ 10 11 public class Solution { 12 /** 13 * 14 * @param root TreeNode类 15 * @param sum int整型 16 * @return bool布尔型 17 */ 18 19 boolean flag; 20 int s; 21 public boolean hasPathSum (TreeNode root, int sum) { 22 // write code here 23 flag=false; 24 s=0; 25 if (root==null) return flag; 26 dfs(root,sum); 27 return flag; 28 } 29 30 31 public void dfs(TreeNode root,int sum) { 32 if (flag) return; 33 s+=root.val; 34 if (root.left==null&&root.right==null&&s==sum) { 35 flag=true; 36 return; 37 } 38 if (root.left!=null) dfs(root.left,sum); 39 if (root.right!=null) dfs(root.right,sum); 40 s-=root.val; 41 } 42 }
思路:dfs遍历所有结果,相等就直接 退出。 需要注意 路径是根节点到叶子节点,不是到任意一个节点。
题2:
JZ34 二叉树中和为某一值的路径(二)
描述
输入一颗二叉树的根节点root和一个整数expectNumber,找出二叉树中结点值的和为expectNumber的所有路径。
1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点
2.叶子节点是指没有子节点的节点
3.路径只能从父节点到子节点,不能从子节点到父节点
4.总节点数目为n
如二叉树root为{10,5,12,4,7},expectNumber为22
则合法路径有[[10,5,7],[10,12]]
数据范围:
树中节点总数在范围 [0, 5000] 内
-1000 <= 节点值 <= 1000
-1000 <= expectNumber <= 1000
1 import java.util.ArrayList; 2 /** 3 public class TreeNode { 4 int val = 0; 5 TreeNode left = null; 6 TreeNode right = null; 7 8 public TreeNode(int val) { 9 this.val = val; 10 11 } 12 13 } 14 */ 15 public class Solution { 16 ArrayList<Integer> list; 17 ArrayList<ArrayList<Integer>> ans; 18 int sum; 19 public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int expectNumber) { 20 list=new ArrayList<>(); 21 sum=0; 22 ans=new ArrayList<>(); 23 if (root==null) return ans; 24 dfs(root,expectNumber); 25 return ans; 26 } 27 28 public void dfs(TreeNode root,int s){ 29 sum+=root.val; 30 list.add(root.val); 31 //System.out.println(sum); 32 if (root.left==null&&root.right==null&&sum==s) { 33 ans.add(new ArrayList<>(list)); 34 } 35 if (root.left!=null) dfs(root.left,s); 36 if (root.right!=null) dfs(root.right,s); 37 sum-=root.val; 38 //System.out.println(sum); 39 list.remove(list.size()-1); 40 } 41 }
思路:跟第一题一样,只不过需要一个数组跟踪当前遍历的数字,注意添加答案数组要
new ArrayList<>(list)