二叉树路径问题:
思路:
思考递归函数要解决的问题:当前节点作为父节点、子节点分别需要做什么
- 当前节点作为父节点,计算其具有的最长同值路径长度,即左同值路径长度+右同值路径长度,更新最大值
// 左右节点路径长度
int left = dfs(root.left);
int right = dfs(root.right);
int left1 = 0;
int right1 = 0;
// 判断是否同值,得到当前左右子树长度
if(root.left != null && root.left.val == root.val){
left1 = left + 1;
}
if(root.right != null && root.right.val == root.val){
right1 = right + 1;
}
// 计算当前节点作为父节点的同值路径长度,更新最大值maxPath
maxPath = Math.max(maxPath, left1 + right1);
- 当前节点作为子节点,为其父节点返回其能提供的最长同值路径长度(即左右子树路径长度中的大值)
return Math.max(left1, right1);
图解:
以虚线圈中节点为例, 作为父节点,其需要计算其左右路径之和, 并以此更新maxPath, 同时作为子节点,其需要为其父节点3返回其左右路径中较大的同值路径长度
总代码:
/**
* 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 {
int maxPath = 0;
public int longestUnivaluePath(TreeNode root) {
dfs(root);
return maxPath;
}
public int dfs(TreeNode root){
if(root == null){
return 0;
}
int left = dfs(root.left);
int right = dfs(root.right);
int left1 = 0;
int right1 = 0;
if(root.left != null && root.left.val == root.val){
left1 = left + 1;
}
if(root.right != null && root.right.val == root.val){
right1 = right + 1;
}
maxPath = Math.max(maxPath, left1 + right1);
return Math.max(left1, right1);
}
}
路径问题例题二:和为某个值的路径
题目描述:在二叉树中找到所有和为值 target 的路径,用 List 返回结果
示例:
思路:
回溯法,遍历某一节点,将target值减去该节点值,若遍历到叶子节点,target==叶子节点值,则将该路径加入结果列表。—— 回溯
class Solution {
List<List<Integer>> ans = new ArrayList<List<Integer>>();
public List<List<Integer>> pathSum(TreeNode root, int target) {
LinkedList<Integer> list = new LinkedList<Integer>();
dfs(root, target, list);
return ans;
}
public void dfs(TreeNode root, int target, LinkedList<Integer> list){
if(root == null){
return;
}
list.offer(root.val);
if(root.left==null && root.right==null && root.val==target){
ans.add(new LinkedList(list));
// 不要提前返回,下面还要回溯
}
dfs(root.left, target-root.val, list);
dfs(root.right, target-root.val, list);
list.removeLast();
}
}