思路
- 二叉搜索树本身包含了元素的排序,左子树的元素 <= 根节点 <= 右子树
- 因为是从根结点到叶子结点的路径之和与指定值k进行对比
- 遍历二叉树,当遍历到叶子结点的时候,判断从根路径到叶子结点的路径和是否和k相等,如果相等则添加该路径
- 路径使用动态数组来存放,每当回退节点的时候去掉最后一个元素值
/**
* 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 {
// 存放结果
List<List<Integer>> ans = new ArrayList();
int target = 0;
public List<List<Integer>> pathSum(TreeNode root, int target) {
// 1. 使用前序遍历
// 判断sum值大于target直接返回
// 遍历每个节点的时候进入队列,更新当前sum
// 每次遍历到叶子节点的时候计判断 队列 当前sum是否等于 target 等于的话就在list中创建一个list
// 不等于sum的时候
this.target = target;
scanTree(root,new ArrayList(),0);
return ans;
}
// 仅扫描树的所有子节点
public void scanTree(TreeNode node, List<Integer> list, int sum) {
if (node == null ) return;
sum += node.val;
list.add(node.val);
// 判断叶子节点
if(node.left == null && node.right == null) {
if (sum == this.target) ans.add(new ArrayList(list));
}
// 扫描左子树
scanTree(node.left, list, sum);
// 扫描右子树
scanTree(node.right, list, sum);
// 该节点判断完成,回退元素节点
list.remove(list.size()-1);
}
}
Q.E.D.