跳至主要內容

34-二叉树中和为某一值的路径

daipeng大约 2 分钟

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

如下所示二叉树,给定节点和为26。

比如路径中结点和为26,那么应该怎么找呢?注意路径是从根节点到叶结点。

根节点是12,那么下面的结点之和为26-12=14,然后看12的左孩子5,到这之后的结点之和为14-5=9。

然后看5的左孩子4,9-4=5,也就是剩余结点之和应该为5,但是4已经是叶子结点了,这条路径看来不行。

接着往回返吧。还回到5,此时需要的剩余结点之和是9,继续看右孩子9,正好所需的就是9,9也是叶子结点,那

么这一条路径就找到了。然后继续在返回到12,看12的右孩子....

也就是我们需要一个用类似栈的元素来提供这种回退的能力。


    private ArrayList<Integer> onePath = new ArrayList<>();
    private ArrayList<ArrayList<Integer>> result = new ArrayList<>();

    public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) {
        if (root == null) {
            return result;
        }
        FindPathCore(root, target);
        return result;
    }

    public void FindPathCore(TreeNode node, int target) {
        if (node == null) {
            return;
        }
        onePath.add(node.val);
        target = target - node.val;
        //如果targe==0了 同时该结点是叶子结点 那么将该路径存起来 同时将该结点从path中去掉 返回到上层结点。
        if (target == 0 && node.left == null && node.right == null) {
            result.add(new ArrayList<>(onePath));
            onePath.remove(onePath.size() - 1);
            return;
        }
        //如果该结点不是一条路径的终结点,那么继续找
        FindPathCore(node.left, target);
        FindPathCore(node.right, target);
        onePath.remove(onePath.size() - 1);
    }