LeetCode119杨辉三角Ⅱ
题目:
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
思路:
构建一个一维数组:从第一层开始往下计算,每层从最后一个数开始计算
代码:
public ArrayList<Integer> getRow(int rowIndex) {
ArrayList<Integer> res = new ArrayList<Integer>();
for(int i=0;i<=rowIndex;++i){ //从i=0开始,因为i<2时,不满足j>0
//所以i=0,i=1不执行下列for循环
for(int j=i-1;j>0;--j)
res.set(j, res.get(j)+res.get(j-1));//dp[i][j]=dp[i-1][j-1]+dp[i][j];
res.add(1);
}
return res;
}
LeetCode124 二叉树最大路径和
题目:
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
思路:
本质:后序遍历,左右根。
如果左子树或者右子树的路径和小于0,那么就不进行计算(无效操作置0不需要考虑去除的概念)
res负责记录每个根节点处的最值(第i乘)
return返回上一层结点,
代码:
int res = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
if(root==null) return 0;
helper(root);
return res;
}
private int helper(TreeNode root) {
if(root==null) return 0;
int left = Math.max(helper(root.left), 0);
int right = Math.max(helper(root.right), 0);
res = Math.max(res, root.val+left+right);
return root.val+(left>right ? left : right);
}
LeetCode687最长同值路径
题目:
给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。注意:两个节点之间的路径长度由它们之间的边数表示。
思路:
类似LeetCode124
利用递归:对于这种树的路径问题,递归是不二之选。在递归函数中,我们首先对其左右子结点调用递归函数,得到其左右子树的最大相同值路径,下面就要来看当前结点和其左右子结点之间的关系了:
如果其左子结点存在且和当前节点值相同,则left自增1,否则left重置0;同理,如果其右子结点存在且和当前节点值相同,则right自增1,否则right重置0。
然后用left+right来更新结果res(由于都和同一个root进行比较,所以可以直接利用left+right更新res)。而调用当前节点值的函数只能返回left和right中的较大值,因为如果还要跟父节点组path,就只能在左右子节点中选一条path,当然选值大的那个了
if(r.val == val) return Math.max(left, right) + 1;
这句代码,需要区分r.val和val分别指带什么!
代码:
private int res= 0;
public int longestUnivaluePath(TreeNode root) {
/**
解题思路类似于124题, 对于任意一个节点, 如果最长同值路径包含该节点, 那么只可能是两种情况:
1. 其左右子树中加上该节点后所构成的同值路径中较长的那个继续向父节点回溯构成最长同值路径
2. 左右子树加上该节点都在最长同值路径中, 构成了最终的最长同值路径
需要注意因为要求同值, 所以在判断左右子树能构成的同值路径时要加入当前节点的值作为判断依据
**/
if(root == null) return 0;
getMaxL(root, root.val);
return res;
}
private int getMaxL(TreeNode r, int val) {
if(r == null) return 0;
int left = getMaxL(r.left, r.val);
int right = getMaxL(r.right, r.val);
res = Math.max(res, left+right); // 路径长度为节点数减1所以此处不加1
if(r.val == val) // 和父节点值相同才返回以当前节点所能构成的最长通知路径长度, 否则返回0
return Math.max(left, right) + 1;
return 0;
}