剑指offer25,二叉树中和为某一值的路径(Java实现)

import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

/**
 * 二叉树中和为某一值的路径
 * 描述:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。
 * @author lenovo047
 *
 */
public class test25 {
    public static void main(String[] args) {
        TreeNode root = new TreeNode(10);
        TreeNode root2 = new TreeNode(5);
        TreeNode root3 = new TreeNode(4);
        TreeNode root4 = new TreeNode(7);
        TreeNode root5 = new TreeNode(12);
        root.left = root2;
        root.right = root5;
        root2.left = root3;
        root2.right = root4;
        ArrayList> res = FindPath(root, 22);
        System.out.println();
        System.out.println(res);
    }
    
    public static ArrayList> FindPath(TreeNode root,int target) {
        if(root == null){
            return new ArrayList<>();
        }
        
        ArrayList> res = new ArrayList<>();
        ArrayList res1 = new ArrayList<>();
        int cur = 0;
        return findPath(root, target, res, res1, cur);
    }

    private static ArrayList> findPath(TreeNode root, int target, ArrayList> res, ArrayList res1, int cur) {
        cur = cur + root.val;  //当前的和加root,res就要放root
        res1.add(root.val);
        //如果是叶节点,并且路径上的和等于target,打印这条路径
        boolean isLeaf = root.left == null && root.right == null;
        if(cur == target && isLeaf == true){
            //
            //System.out.println(res1);
            ArrayList list = new ArrayList<>();
            for (Integer integer : res1) {
                list.add(integer);
            }
            res.add(list);
            
            //System.out.println("res" + res);
        }
        
        //如果不是叶子节点
        if(root.left != null){
            findPath(root.left, target, res, res1, cur);
        }
        if(root.right != null){
            findPath(root.right, target, res, res1, cur);
        }
        
        //如果是叶子节点,路径和不等于target
        cur = cur - root.val;
        res1.remove(res1.size()-1);
        return res;
    }

}
 

你可能感兴趣的:(剑指offer)