题1:
JZ84 二叉树中和为某一值的路径(三)
描述
给定一个二叉树root和一个整数值 sum ,求该树有多少路径的的节点值之和等于 sum 。 1.该题路径定义不需要从根节点开始,也不需要在叶子节点结束,但是一定是从父亲节点往下到孩子节点 2.总节点数目为n 3.保证最后返回的路径个数在整形范围内(即路径个数小于231-1) 数据范围: 0<=n<=10000<=n<=1000-10^9<=节点值<=10^9−109<=节点值<=109
假如二叉树root为{1,2,3,4,5,4,3,#,#,-1},sum=6,那么总共如下所示,有3条路径符合要求
1 import java.util.*; 2 3 /* 4 * public class TreeNode { 5 * int val = 0; 6 * TreeNode left = null; 7 * TreeNode right = null; 8 * public TreeNode(int val) { 9 * this.val = val; 10 * } 11 * } 12 */ 13 14 public class Solution { 15 /** 16 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 17 * 18 * 19 * @param root TreeNode类 20 * @param sum int整型 21 * @return int整型 22 */ 23 int s=0; 24 int ans; 25 26 public int FindPath (TreeNode root, int sum) { 27 // write code here 28 int res=0; 29 if (root==null) return res; 30 Queue<TreeNode> queue=new LinkedList<>(); 31 queue.offer(root); 32 while (!queue.isEmpty()){ 33 TreeNode temp=queue.poll(); 34 ans=0; 35 res+=FromThisToEnd(temp,sum); 36 if (temp.left!=null) queue.offer(temp.left); 37 if (temp.right!=null) queue.offer(temp.right); 38 //System.out.println(temp.val); 39 } 40 return res; 41 } 42 43 44 public int FromThisToEnd(TreeNode root,int sum){ 45 if (root!=null) { 46 s+=root.val; 47 if (s==sum) ans++; 48 FromThisToEnd(root.left,sum); 49 FromThisToEnd(root.right,sum); 50 s-=root.val; 51 } 52 return ans; 53 } 54 }
思路:自定义函数计算当前节点满足条件的数量,遍历树的所有节点,累加结果。
题2:
JZ86 在二叉树中找到两个节点的最近公共祖先
描述
给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。 数据范围:1 \le n \le 10001≤n≤1000,树上每个节点的val满足 0<val \le 1000<val≤100 要求:时间复杂度 O(n)O(n) 注:本题保证二叉树中每个节点的val值均不相同。 如当输入[3,5,1,6,2,0,8,#,#,7,4],5,1时,二叉树{3,5,1,6,2,0,8,#,#,7,4}如下图所示: 所以节点值为5和节点值为1的节点的最近公共祖先节点的节点值为3,所以对应的输出为3。 节点本身可以视为自己的祖先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 o1 int整型 16 * @param o2 int整型 17 * @return int整型 18 */ 19 Map<Integer,Integer> map; 20 public int lowestCommonAncestor (TreeNode root, int o1, int o2) { 21 // write code here 22 map=new HashMap<>(); 23 dfs(root); 24 Set<Integer> set1=new HashSet<>(); 25 set1.add(o1); 26 while (map.containsKey(o1)) { 27 o1=map.get(o1); 28 set1.add(o1); 29 } 30 //for (int s:set1) System.out.print(s+" "); 31 while (!set1.contains(o2)){ 32 o2=map.get(o2); 33 } 34 return o2; 35 } 36 37 public void dfs(TreeNode root){ 38 if (root==null) return; 39 if (root.left!=null) { 40 map.put(root.left.val,root.val); 41 dfs(root.left); 42 //System.out.println(root.left.val+"->"+root.val); 43 } 44 if (root.right!=null) { 45 map.put(root.right.val,root.val); 46 dfs(root.right); 47 //System.out.println(root.right.val+"->"+root.val); 48 } 49 50 51 } 52 }
思路:遍历树,因为节点值不同,利用hashmap将节点的祖先存入map,遍历一个节点的所有祖先存入set,再遍历另外一个节点的祖先出现重复就是结果。注意,自己也是自己的祖先,所以要把自己也放入集合。