二叉树中和为某一值的路径【Java】

*爱你&永不变心* 提交于 2019-12-31 12:49:16

题目描述:

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

问题描述:

很明显是树的遍历而且还是先根遍历(先序遍历/前序遍历)。

理由:路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径

第一种解法儿

import java.util.ArrayList;

public class Solution {

    private ArrayList<ArrayList<Integer>> arrayLists = new ArrayList<>();

    public static void main(String[] args) {
        Solution solution = new Solution();
        TreeNode root = new TreeNode(10);
        TreeNode left1 = new TreeNode(6);
        TreeNode right1 = new TreeNode(12);
        TreeNode left2 = new TreeNode(5);
        TreeNode right2 = new TreeNode(9);
        TreeNode left3 = new TreeNode(5);
        TreeNode right3 = new TreeNode(8);
        TreeNode left4 = new TreeNode(5);
        TreeNode right4 = new TreeNode(4);
        root.left = left1;
        root.right = right1;
        left1.left = left2;
        left1.right = right2;
        left2.left = left3;
        left2.right = right3;
        right1.left = left4;
        right1.right = right4;
        ArrayList<ArrayList<Integer>> arrayLists = solution.FindPath(root, 26);
        for (ArrayList<Integer> list : arrayLists) {
            for (Integer integer : list) {
                System.out.print(integer + "\t");
            }
            System.out.println();
        }
    }

    public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) {
        if(root == null){
            return arrayLists;
        }
        ArrayList<Integer> list = new ArrayList<>();
        getPath(list,root,target);
        return arrayLists;
    }
    /**
     * 先根遍历,顺便查一下是否该路径是否符合要求
     */
    private void getPath(ArrayList<Integer> list, TreeNode root, int target){
        if(target < 0 || root == null){
            return;
        }
        if(root.right == null && root.left == null){
            if(target == root.val){
                // 将符合要求的加入到结果集中
                list.add(root.val);
                arrayLists.add(list);
                return ;
            }
            return ;
        }
        list.add(root.val);
        // 如果使用list,就是先根遍历的结果了,而不是路径了,所以这里给一个新的数组,里面包含root节点的值就行了。
        ArrayList<Integer> cp = new ArrayList<>(list);
        getPath(list,root.left,target - root.val);
        getPath(cp,root.right,target - root.val);
    }

}

class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

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

    }
}

第二种,一开始的时候没想第二种,看到牛客上的评论区的时候才想着找找,然后来源的博主的链接:

https://blog.csdn.net/zjxxyz123/article/details/79699575

给出第二种思路主要是第一种思路非常的费空间,所以给出一个更好的解法儿,同时也是学习牛人的牛经验,反思自己。

代码的话,自己去看看吧,就不做搬运工了,也好给作者增加访问量,思路我贴出来就行了。

(感觉真的是人外有人,山外有山,牛P的人是真滴牛P,我这菜鸡是没得比的。)

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!