472.二叉树的路径和 III

描述

给一棵二叉树和一个目标值,找到二叉树上所有的和为该目标值的路径。路径可以从二叉树的任意节点出发,任意节点结束。

样例

给一棵这样的二叉树:

        1
       / \
      2   3
     /
    4

和目标值 target = 6。你需要返回的结果为:

    [
      [2, 4],
      [2, 1, 3],
      [3, 1, 2],
      [4, 2]
    ]

思路

遍历所有可能的点,把当前点当成拐点,左子树的每条路径和与当前点的值以及右子树的每条路径和分别组合起来构成了当前结点的全部路径

代码

/**
 * Definition of ParentTreeNode:
 * 
 * class ParentTreeNode {
 *     public int val;
 *     public ParentTreeNode parent, left, right;
 * }
 */
public class Solution {
    /**
     * @param root the root of binary tree
     * @param target an integer
     * @return all valid paths
     */
    public List<List<Integer>> binaryTreePathSum3(ParentTreeNode root, int target) {
        List<List<Integer>> results = new ArrayList<List<Integer>>();
        dfs(root, target, results);
        return results;
    }
    
    public void dfs(ParentTreeNode root, int target, List<List<Integer>> results) {
        if (root == null) {
            return;
        }

        List<Integer> path = new ArrayList<Integer>();
        findSum(root, null, target, path, results);
·   
        dfs(root.left, target, results);
        dfs(root.right, target, results);
    }

    public void findSum(ParentTreeNode root, 
                        ParentTreeNode father, 
                        int target,
                        List<Integer> path, 
                        List<List<Integer>> results) {
        path.add(root.val);
        
        target -= root.val;
        if (target == 0) {
            results.add(new ArrayList(path));
        }
        
        // 类似图遍历算法,往 left、right、parent 三个方向遍历,
        // 通过判断 parent 指针是否等于 father 来判断是否出现往回遍历的情形
        // 当前结点指针往上遍历时,下一轮递归 root.parent 做根结点同样往三个方向遍历,如果往下就可能出现重复
        // 判断条件就是防止出现这种情况
        if (root.parent != null && root.parent != father) {
            findSum(root.parent, root, target, path, results);
        }

        if (root.left != null && root.left  != father) {
            findSum(root.left, root, target, path, results);
        }

        if (root.right != null && root.right != father) {
            findSum(root.right, root, target, path, results);
        }

        path.remove(path.size() - 1);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 树的概述 树是一种非常常用的数据结构,树与前面介绍的线性表,栈,队列等线性结构不同,树是一种非线性结构 1.树的定...
    Jack921阅读 9,934评论 1 31
  • 1 序 2016年6月25日夜,帝都,天下着大雨,拖着行李箱和同学在校门口照了最后一张合照,搬离寝室打车去了提前租...
    RichardJieChen阅读 10,610评论 0 12
  • 面试题7:重建二叉树 题目: 输入某二叉树的前序遍历和中序遍历的结果。请重建该二叉树。假设输入的前序遍历和中序遍历...
    lyoungzzz阅读 3,613评论 0 0
  • 去年二叉树算法的事情闹的沸沸扬扬,起因是Homebrew 的作者 @Max Howell 在 twitter 上发...
    Masazumi柒阅读 5,505评论 0 8
  • 上一章 风轻扬夏未央(1)—重逢 2009,初遇 时间追溯到十年前,峻泽市。 那会儿的天空就像是刚刚洗涤过的一条蓝...
    AnAn姑娘呀阅读 3,508评论 4 4