1. 程式人生 > >【劍指offer-Java版】25二叉樹中和為某一值的路徑

【劍指offer-Java版】25二叉樹中和為某一值的路徑

二叉樹中值和為某一值的路徑:類似圖的深度優先遍歷

對於此類問題一直有點弱,多想幾次就OK了–主要是不熟悉,畢竟程式碼寫出來之後一看就明白,但是自己想的時候還是有點困難


    public class _Q25 {

    public void FindPathInTree(BinaryTreeNode<Integer> tree, int expectedSum){
        if(tree == null) return;

        Vector<BinaryTreeNode<Integer>> path = new Vector<>();
        int
curSum = 0; FindAndPrintPath(tree, expectedSum, curSum, path); } private void FindAndPrintPath(BinaryTreeNode<Integer> tree, int expectedSum, int curSum, Vector<BinaryTreeNode<Integer>> path){ if(tree == null) return; curSum = curSum + tree.value
; path.add(tree); if(curSum == expectedSum && tree.leftChild == null && tree.rightChild == null){ for(int i=0; i<path.size(); i++){ System.out.print(path.get(i).value + " "); } System.out.println(); } if
(tree.leftChild != null) FindAndPrintPath(tree.leftChild, expectedSum, curSum, path); if(tree.rightChild != null) FindAndPrintPath(tree.rightChild, expectedSum, curSum, path); path.remove(path.size() - 1); // 回溯 } }

測試程式碼:


    public class _Q25Test extends TestCase {

    _Q25 printTreePath = new _Q25();

    public void test(){
        BinaryTreeNode<Integer> root = new BinaryTreeNode<>();
        BinaryTreeNode<Integer> node1 = new BinaryTreeNode<>();
        BinaryTreeNode<Integer> node2 = new BinaryTreeNode<>();
        BinaryTreeNode<Integer> node3 = new BinaryTreeNode<>();
        BinaryTreeNode<Integer> node4 = new BinaryTreeNode<>();

        root.value = 10;
        node1.value = 5;
        node2.value = 12;
        node3.value = 4;
        node4.value = 7;

        root.leftChild = node1;
        root.rightChild = node2;
        node1.leftChild = node3;
        node1.rightChild = node4;

        node2.leftChild = null; node2.rightChild = null;
        node3.leftChild = null; node3.rightChild = null;
        node4.leftChild = null; node4.rightChild = null;

        printTreePath.FindPathInTree(root, 22);
    }
    }