47、路径总和
给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。
路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int pathSum(TreeNode root, int targetSum) {
Map<Long,Integer> prefix = new HashMap<Long,Integer>();
prefix.put(0L,1);
return dfs(root,prefix,0,targetSum);
}
public int dfs(TreeNode root,Map<Long,Integer> prefix,long curr,int targetSum) {
if (root == null) {
return 0;
}
int ret = 0;
curr += root.val;
ret = prefix.getOrDefault(curr - targetSum,0);
prefix.put(curr,prefix.getOrDefault(curr,0) + 1);
ret += dfs(root.left,prefix,curr,targetSum);
ret += dfs(root.right,prefix,curr,targetSum);
prefix.put(curr,prefix.getOrDefault(curr,0) - 1);
return ret;
}
}
48、找树中两个指定节点的最近公共祖先

/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
private TreeNode ans;
public Solution() {
this.ans = null;
}
private boolean dfs(TreeNode root,TreeNode p,TreeNode q) {
if (root == null) return false;
boolean lson = dfs(root.left,p,q);
boolean rson = dfs(root.right,p,q);
if ((lson && rson) || ((root.val = p.val || root.val == q.val) && (lson || rson))) {
ans = root;
}
return lson || rson || (root.val == p.val || root.val == q.val);
}
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
this.dfs(root,p,q);
return this.ans;
}
}
|
作者:万能包哥 出处:http://www.cnblogs.com/mybloger/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 如果文中有什么错误,欢迎指出。以免更多的人被误导。 |
浙公网安备 33010602011771号