1. 程式人生 > >LeetCode演算法題-Binary Tree Paths(Java實現-3種解法)

LeetCode演算法題-Binary Tree Paths(Java實現-3種解法)

這是悅樂書的第199次更新,第206篇原創

01 看題和準備

今天介紹的是LeetCode演算法題中Easy級別的第62題(順位題號是257)。給定二叉樹,返回所有根到葉路徑。例如:

輸入:

  1
 / \
2   3
 \
  5

輸出:[“1-> 2-> 5”,“1-> 3”]

說明:所有根到葉路徑是:1-> 2-> 5, 1-> 3

注意:葉子是沒有子節點的節點。

本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。

02 第一種解法

特殊情況:當根節點為null的時候,直接返回空陣列。

正常情況:深度遍歷,從根節點開始,依次從左節點開始,一直往左節點遍歷進去,直到遇到葉子節點,此時就構成一條完整的路徑,而其相鄰的右葉子結點,以及從根節點開始的右節點,這些都是一條完整的路徑。

public List<String> binaryTreePaths(TreeNode root) {
    List<String> list = new ArrayList<String>();
    if (root == null) {
        return list;
    }
    helperFun(root, list, "");
    return list;
}

public void helperFun(TreeNode root, List<String> list, String path) {
    if (root.left != null) {
        helperFun(root.left, list, path + root.val + "->");
    }
    if (root.right != null) {
        helperFun(root.right, list, path + root.val + "->");
    }
    if (root.left == null && root.right == null) {
        list.add(path + root.val);
    }
}


03 第二種解法

此解法也是利用遞迴,遞迴雖然寫在方法內部了,但是思路和上面第一種解法的遞迴是一樣的。

public List<String> binaryTreePaths2(TreeNode root) {
    List<String> list = new ArrayList<String>();
    if (root == null) {
        return list;
    }
    if (root.left == null && root.right == null) {
        list.add(root.val+"");
        return list;
    }
    for (String path : binaryTreePaths(root.left)) {
        list.add(root.val+"->"+path);
    }
    for (String path : binaryTreePaths(root.right)) {
        list.add(root.val+"->"+path);
    }
    return list;
}


04 第三種解法

使用迭代的方法,藉助兩個棧,一個儲存節點資訊,一個儲存路徑資訊。

public List<String> binaryTreePaths3(TreeNode root) {
    List<String> list = new ArrayList<String>();
    Stack<TreeNode> sNode = new Stack<TreeNode>();
    Stack<String> sStr = new Stack<String>();
    if (root == null){
        return list;
    }
    sNode.push(root);
    sStr.push("");
    while (!sNode.isEmpty()) {
        TreeNode curNode = sNode.pop();
        String curStr = sStr.pop();
        if (curNode.left == null && curNode.right == null) {
            list.add(curStr + curNode.val);
        }
        if (curNode.left != null) {
            sNode.push(curNode.left);
            sStr.push(curStr + curNode.val + "->");
        }
        if (curNode.right != null) {
            sNode.push(curNode.right);
            sStr.push(curStr + curNode.val + "->");
        }
    }
    return list;
}


05 小結

演算法專題目前已連續日更超過一個月,演算法題文章62+篇,公眾號對話方塊回覆【資料結構與演算法】、【演算法】、【資料結構】中的任一關鍵詞,獲取系列文章合集。

以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!