面试题34:二叉树中,和为某一值的路径

/*

 * 面试题34:二叉树中,和为某一值的路径

 * 题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

 * 思路:由于路径是从根节点出发到叶节点,在三种遍历中,只有前序遍历是首先访问根节点的。

 */

 

import java.util.ArrayList;

 

class TreeNode5 {

    int val = 0;

    TreeNode5 left = null;

    TreeNode5 right = null;

 

    public TreeNode5(int val) {

       this.val = val;

 

    }

 

}

 

public class No34FindPath {

 

    public static void main(String[] args) {

       No34FindPath n = new No34FindPath();

      

       TreeNode5 root = new TreeNode5(10);

       TreeNode5 node5 = new TreeNode5(5);

       TreeNode5 node12 = new TreeNode5(12);

       root.left = node5;

       root.left.right = node12;

      

       TreeNode5 node4 = new TreeNode5(4);

       TreeNode5 node7 = new TreeNode5(7);

       node5.left = node4;

       node5.right = node7;

      

       ArrayList<ArrayList<Integer>> a = n.FindPath(root ,19);

 

      

       for (int i = 0; i < a.size(); i++)

 

       {

 

           System.out.println(a.get(i));

 

       }

       /*for(ArrayList<Integer> i:a){

           System.out.println(i);

       }   */

 

    }

    //用来保存符合要求的路径

    ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();

    //用来保存一条路径

    ArrayList<Integer> path = new ArrayList<Integer>();

   

    public ArrayList<ArrayList<Integer>> FindPath(TreeNode5 root, int target) {

       if (root == null) {

           return res;

       }

      

       findpath(root,target);

      

       return res;

    }

 

    private void findpath(TreeNode5 root, int target) {

       //将根节点加入到路径中

       path.add(root.val);

       //如果找到这个值,且到达叶子节点,则将这条路径放到res中,即符合要求的路径

       if (root.val == target && root.left  == null && root.right == null) {

           res.add(new ArrayList<Integer>(path));

       }

       //如果不是叶子节点,则递归调用

       if (!(root.left == null)) {

           findpath(root.left ,target - root.val);

       }

      

       if (!(root.right == null)) {

           findpath(root.right,target -root.val);

       }

      

       //在返回父节点之前,在路径上删除当前节点

       path.remove(path.size() - 1);

       return;

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值