472.二叉樹的路徑和 III

描述

給一棵二叉樹和一個目標值,找到二叉樹上所有的和為該目標值的路徑。路徑可以從二叉樹的任意節(jié)點出發(fā),任意節(jié)點結束。

樣例

給一棵這樣的二叉樹:

        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 來判斷是否出現(xiàn)往回遍歷的情形
        // 當前結點指針往上遍歷時,下一輪遞歸 root.parent 做根結點同樣往三個方向遍歷,如果往下就可能出現(xiàn)重復
        // 判斷條件就是防止出現(xiàn)這種情況
        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);
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 樹的概述 樹是一種非常常用的數(shù)據(jù)結構,樹與前面介紹的線性表,棧,隊列等線性結構不同,樹是一種非線性結構 1.樹的定...
    Jack921閱讀 4,762評論 1 31
  • 1 序 2016年6月25日夜,帝都,天下著大雨,拖著行李箱和同學在校門口照了最后一張合照,搬離寢室打車去了提前租...
    RichardJieChen閱讀 5,377評論 0 12
  • 面試題7:重建二叉樹 題目: 輸入某二叉樹的前序遍歷和中序遍歷的結果。請重建該二叉樹。假設輸入的前序遍歷和中序遍歷...
    lyoungzzz閱讀 637評論 0 0
  • 去年二叉樹算法的事情鬧的沸沸揚揚,起因是Homebrew 的作者 @Max Howell 在 twitter 上發(fā)...
    Masazumi柒閱讀 1,676評論 0 8
  • 上一章 風輕揚夏未央(1)—重逢 2009,初遇 時間追溯到十年前,峻澤市。 那會兒的天空就像是剛剛洗滌過的一條藍...
    AnAn姑娘呀閱讀 624評論 4 4

友情鏈接更多精彩內容