257. Binary Tree Paths

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的題目。)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容