牛客_剑指offer题集——二叉树中和为某一值的路径(java实现)

题目链接:

https://www.nowcoder.com/practice/b736e784e3e34731af99065031301bca?tpId=13&tqId=11177&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

思路:边遍历边记录节点,如果节点和等于目标值,则在全局变量中加入路径

需要注意的点:

1. 因为arrayList传入方法后会产生永久性改变,所以要进行回溯,否则会将所有节点记录

2.    因为定义的一个对象就对应一个特定的对象,所以在存入全局变量时需要新建立对象,否则存入的只是指针,在后续的操作中存入的数据也会改变

 

实现源码:

package niuke;

import java.util.ArrayList;

public class 二叉树中和为某一值的路径 {
    private ArrayList<ArrayList<Integer>> list = new ArrayList<>();
    public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) {
        find_path_by_inOrder(new ArrayList<Integer>(),root,target,0);
        return this.list;
    }

    private void find_path_by_inOrder(ArrayList<Integer> list
            ,TreeNode root,int target,int sum){
        if(root==null){
            list.add(0);
            return;
        }
        list.add(root.val);
        sum += root.val;
        if(root.right==null&&root.left==null&&sum==target){//确定是叶子结点
            this.list.add(new ArrayList<Integer>(list));
            //注意此处加进去的列表一定要新建,否则加进去的只是指针,后来全部一样
            return;
        }else if(root.right==null&&root.left==null)
            return;

        find_path_by_inOrder(list,root.left,target,sum);
        list.remove(list.size()-1);
        find_path_by_inOrder(list, root.right, target, sum);
        list.remove(list.size()-1);
    }
}

代码已经ac

希望对大家有所帮助

以上

posted @ 2020-03-09 12:23  醉生梦死_0423  阅读(154)  评论(0编辑  收藏  举报