思路

  1. 二叉搜索树本身包含了元素的排序,左子树的元素 <= 根节点 <= 右子树
  2. 因为是从根结点到叶子结点的路径之和与指定值k进行对比
  3. 遍历二叉树,当遍历到叶子结点的时候,判断从根路径到叶子结点的路径和是否和k相等,如果相等则添加该路径
  4. 路径使用动态数组来存放,每当回退节点的时候去掉最后一个元素值
/**
 * 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.


每一个平凡的日常都是连续的奇迹