首页 > 技术文章 > 二叉树中和为某一值的路径

nickup 2018-10-12 23:04 原文

package 剑指offer.二叉树中和为某一值的路径;

import java.util.ArrayList;

/**
 * Created by nick on 2018/10/12.
 */
public class Solution {
    public static void main(String[] args) {
        TreeNode root =new TreeNode(10);
        root.left=new TreeNode(5);
        root.right=new TreeNode(12);
        root.left.left=new TreeNode(4);
        root.left.right=new TreeNode(7);
        ArrayList<ArrayList<Integer>> m= new Solution().FindPath(root,22);
        System.out.println(m);
    }
    ArrayList<ArrayList<Integer>> listall = new ArrayList<ArrayList<Integer>>();
    public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
        ArrayList<Integer> m=new ArrayList<Integer>();
        if (root == null) {
            return listall;
        }
        Find(root , target ,m);
        return listall;
    }
    public void Find(TreeNode root,int target,ArrayList<Integer> m){

        target=target-root.val;
        m.add(root.val);
        if(target<0||root==null)
            return;
        if(target==0&&root.right==null&&root.left==null)
        {
            ArrayList<Integer> path = new ArrayList<Integer>();
            for (int i = 0; i < m.size(); i++) {
                path.add(m.get(i));//防止m的变化对结果的影响
            }
            listall.add(path);//list是单独的一条
            m.remove(m.size()-1);
            return;
        }

        if(target>0&&root.left!=null)
        {
            Find(root.left,target,m);
        }
//      m.remove(m.size()-1);//return出来才删除
        if(target>0&&root.right!=null)
        {
            Find(root.right,target,m);
        }
        //如果当前路径值和大于目标值或者找到一条路径则回到上一层
        m.remove(m.size()-1);
    }
}
class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}

 

推荐阅读