您当前的位置: 首页 >  算法

Phil Arist

暂无认证

  • 1浏览

    0关注

    276博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

算法修炼 24、二叉树中和为某一值的路径

Phil Arist 发布时间:2021-10-19 18:00:17 ,浏览量:1

 题目描述:

  输入一颗二叉树的根结点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)

  解题思路:

  本题实质上就是深度优先搜索。使用前序遍历的方式对整棵树进行遍历,当访问到某一个结点时,将该结点添加到路径上,并且累加该结点的值。当访问到的结点是叶结点时,如果路径中的结点值之和正好等于输入的整数,则说明是一条符合要求的路径。如果当前结点不是叶结点,则继续访问它的子结点。

  当找到一条符合要求的路径之后,需要回溯进一步查找别的路径,因此,这实际上仍然是一个递归的过程,特别注意在函数返回之前要删掉当前结点,从而才可以正确的回溯。

  举例:

  编程实现(Java):

public class Solution {
    private ArrayList res = new ArrayList();
    private lengthCompare c=new lengthCompare();
    public ArrayList FindPath(TreeNode root,int target) {
        if(root==null)
            return res;
        ArrayList temp=new ArrayList();
        FindPath(root,target,temp);
        res.sort(c);
        return res;
    }
    public void FindPath(TreeNode root,int target,ArrayList temp){
        temp.add(root.val);
        if(root.left==null && root.right==null){ //root是叶结点
            if(root.val==target) {//找到了一条路径
                ArrayList list=new ArrayList();
                list.addAll(temp);
                res.add(list);
            }
        }
        else{
            if(root.left!=null)
                FindPath(root.left,target-root.val,temp);
            if(root.right!=null)
                FindPath(root.right,target-root.val,temp);
        }
        if(temp.size()!=0) //回溯
            temp.remove(temp.size()-1);
    }
    class  lengthCompare implements Comparator{
        public int compare(ArrayList a,ArrayList b){
            if(a.size()>b.size())
               return -1;
            else if(a.size()==b.size())
                return 0;
            else
                return 1;
        }
    }
}

关注
打赏
1662360869
查看更多评论
立即登录/注册

微信扫码登录

0.0573s