回溯法 解決二叉樹中找一條和爲固定數值的路徑(java)

問題描述

其中路徑指的是從跟節點到葉子節點經過的路徑

代碼

package com.yuzhiyun;

import java.util.ArrayList;
import java.util.List;

public class FindPathInBinaryTree {

    /**
     * 二叉樹的樹結點
     */
    public static class BinaryTreeNode {
        int value;
        BinaryTreeNode left;
        BinaryTreeNode right;
    }

    /**
     * 輸入一棵二叉樹和一個整數, 打印出二叉樹中結點值的和爲輸入整數的所有路徑。 從樹的根結點開始往下一直到葉銷點所經過的結點形成一條路徑。
     *
     * @param root
     *            樹的根結點
     * @param expectedSum
     *            要求的路徑和
     */
    public static void findPath(BinaryTreeNode root, int expectedSum) {
        // 創建一個鏈表,用於存放根結點到當前處理結點的所經過的結點
        List<Integer> list = new ArrayList<>();
        // 如果根結點不爲空,就調用輔助處理方法
        if (root != null) {
            findPath(root, 0, expectedSum, list);
        }
    }

    /**
     * @param root
     *            當前要處理的結點
     * @param curSum
     *            當前記錄的和(還未加上當前結點的值)
     * @param expectedSum
     *            要求的路徑和
     * @param result
     *            根結點到當前處理結點的所經過的結點,(還未包括當前結點)
     */
    public static void findPath(BinaryTreeNode root, int curSum, int expectedSum, List<Integer> result) {
        // 如果結點不爲空就進行處理
        if (root != null) {
            // 加上當前結點的值
            curSum += root.value;
            // 將當前結點入隊
            result.add(root.value);
            // 如果當前結點的值小於期望的和
            if (curSum < expectedSum) {
                // 遞歸處理左子樹
                findPath(root.left, curSum, expectedSum, result);
                // 遞歸處理右子樹
                findPath(root.right, curSum, expectedSum, result);
            }
            // 如果當前和與期望的和相等
            else if (curSum == expectedSum) {
                // 當前結點是葉結點,則輸出結果
                if (root.left == null && root.right == null) {
                    System.out.println(result);
                }
            }
            // 移除當前結點,向上回溯
            result.remove(result.size() - 1);
        }
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        //      10
        //     / \
        //    5 12
        //   /\
        //  4  7
        BinaryTreeNode root = new BinaryTreeNode();
        root.value = 10;
        root.left = new BinaryTreeNode();
        root.left.value = 5;
        root.left.left = new BinaryTreeNode();
        root.left.left.value = 4;
        root.left.right = new BinaryTreeNode();
        root.left.right.value = 7;
        root.right = new BinaryTreeNode();
        root.right.value = 12;
        // 有兩條路徑上的結點和爲22
        System.out.println("findPath(root, 22);");
        findPath(root, 22);
        // 沒有路徑上的結點和爲15
        System.out.println("findPath(root, 15);");
        findPath(root, 15);
        // 有一條路徑上的結點和爲19
        System.out.println("findPath(root, 19);");
        findPath(root, 19);
    }

}

運行結果

findPath(root, 22);
[10, 5, 7]
[10, 12]
findPath(root, 15);
findPath(root, 19);
[10, 5, 4]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章