Given a binary tree, return all root-to-leaf paths.
For example, given the following binary tree:
1
/
2 3
5
All root-to-leaf paths are:
["1->2->5", "1->3"]
["1->2->5", "1->3"]
這是一道送分題,dfs就好了。但是,送分題也有值得思考的地方。。。這題我用String作參數很快就AC了,但之后嘗試用StringBuilder來做dfs參數(因為不用每次遞歸都生成一個新的String對象,相對節省空間),寫了好幾次都沒法AC。上班要遲到了。。晚上回來再想一下StringBuilder的實現。
用String作dfs參數:
public List<String> binaryTreePaths(TreeNode root) {
List<String> res = new ArrayList<>();
if (root == null) return res;
String item = "";
dfs(res, root, item);
return res;
}
private void dfs(List<String> res, TreeNode root, String item) {
if (root == null) return;
if (isLeaf(root)) {
item += root.val;
res.add(item);
return;
}
dfs(res, root.left, item + root.val + "->");
dfs(res, root.right, item + root.val + "->" );
}
private boolean isLeaf(TreeNode node) {
return (node != null && node.left == null && node.right == null);
}
下班了。
今天吃完了飯,八點到家的。。腹肌+洗漱+玩手機又十點了。。。。怎么辦啊我這執行力。明天回來應該把手機丟一邊了。
貼一下用StringBuilder做的代碼吧,但是這個代碼是不能AC的,因為我沒有append"->"箭頭符號進去,箭頭符號append進去的話,恢復現場就比較困難。。想恢delete后三位,卻總是錯亂。索性放棄了。值得注意的是,在發現是node是leaf的時候,也要執行刪除結點操作,總之就是每次add完了都要對應一個delete。這寫法跟generate parentheses很像。
private void dfs(List<String> res, TreeNode root, StringBuilder sb) {
if (isLeaf(root)) {
sb.append(root.val);
res.add(new String(sb));
sb.deleteCharAt(sb.length() - 1);
return;
}
if (root.left != null) {
sb.append(root.val).append("->");
dfs(res, root.left, sb);
sb.deleteCharAt(sb.length() - 1);
}
if (root.right != null) {
sb.append(root.val).append("->");
dfs(res, root.right, sb);
sb.deleteCharAt(sb.length() - 1);
}
}
Leetcode的高票答案:
總體還是dfs。他這種寫法就像surrounded regions的dfs一樣,在判斷下一層滿足之后才進入下一層,可以避免很多次遞歸。
public List<String> binaryTreePaths(TreeNode root) {
List<String> answer = new ArrayList<String>();
if (root != null) searchBT(root, "", answer);
return answer;
}
private void searchBT(TreeNode root, String path, List<String> answer) {
if (root.left == null && root.right == null) answer.add(path + root.val);
if (root.left != null) searchBT(root.left, path + root.val + "->", answer);
if (root.right != null) searchBT(root.right, path + root.val + "->", answer);
}
(最近幾題是按照dfs 的tag來做的,但是遇到有比較復雜定義的題目,比如courses schedule之類幾道graph類型的題目就跳過了。。所以總是遇到binary tree的題目。)