《劍指 offer》 學習24之二叉樹中和爲某一值的路徑

題目描述

輸入一顆二叉樹的根節點和一個整數,打印出二叉樹中結點值的和爲輸入整數的所有路徑。路徑定義爲從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。(注意: 在返回值的list中,數組長度大的數組靠前)
下圖的二叉樹有兩條和爲 22 的路徑:10, 5, 7 和 10, 12
image.png
題目鏈接:牛客網

解題思路

import java.util.*;

public class Main {
    public static class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;

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

        }

    }
    
    public static ArrayList<ArrayList<Integer>> list = new ArrayList();
    
	public static void main(String[] args) {
	    TreeNode root = new TreeNode(10);
        root.right = new TreeNode(12);
        root.left = new TreeNode(5);
        root.left.left = new TreeNode(4);
        root.left.right = new TreeNode(7);
        
        ArrayList<ArrayList<Integer>> infos = findPath(root,22);
        for (ArrayList<Integer> info : infos) {
            printList(info);
        }
	}
	
	public static ArrayList<ArrayList<Integer>> findPath(TreeNode root,int target) {
	    backtracking(root,target,new ArrayList<>());
	    return list;
	}
	
	public static void backtracking(TreeNode node,int target,ArrayList<Integer> path) {
	    if (node == null) {
	        return;
	    } 
	    
	    path.add(node.val);
	    target -= node.val;
	    if (target == 0 && node.left == null && node.right == null) {
	        list.add(new ArrayList<>(path));
	    }else {
	        backtracking(node.left,target,path);
	        backtracking(node.right,target,path);
	    }
	    path.remove(path.size() - 1);  // 移除當前結點
	}
	
	public static void printList(ArrayList list) {
	    for (int i = 0;i < list.size();i++) {
	        System.out.print(list.get(i) + " ");
	    } 
	    System.out.println();
	}
}

測試結果

image.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章