LeetCode演算法題-Binary Tree Paths(Java實現-3種解法)
阿新 • • 發佈:2018-12-12
這是悅樂書的第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+篇,公眾號對話方塊回覆【資料結構與演算法】、【演算法】、【資料結構】中的任一關鍵詞,獲取系列文章合集。
以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!