472. 두 갈래 나무의 경로와 III

2359 단어
묘사
두 갈래 나무와 목표 값을 주고 두 갈래 나무에 있는 모든 것과 목표 값의 경로를 찾습니다.경로는 두 갈래 나무의 임의의 노드에서 출발하여 임의의 노드가 끝날 수 있다.
예제
이런 두 갈래 나무 한 그루에게
        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> binaryTreePathSum3(ParentTreeNode root, int target) {
        List> results = new ArrayList>();
        dfs(root, target, results);
        return results;
    }
    
    public void dfs(ParentTreeNode root, int target, List> results) {
        if (root == null) {
            return;
        }

        List path = new ArrayList();
        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 path, 
                        List> 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);
    }
}

좋은 웹페이지 즐겨찾기