leetcode-257. 二叉樹的所有路徑刷題筆記(c++)

寫在前面

  • 難度:簡單
  • 遞歸遍歷 / 深度優先遍歷(dfs)

題目詳情

給定一個二叉樹,返回所有從根節點到葉子節點的路徑。

說明: 葉子節點是指沒有子節點的節點。

示例:

輸入:

   1
 /   \
2     3
 \
  5

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

解釋: 所有根節點到葉子節點的路徑爲: 1->2->5, 1->3

ac代碼

  • 解題思想
    • 遞歸迭代
    • for循環逆序拼裝(左右均可能有多個路徑)
    • 遞歸迭代變量、數組值/大小關係!!!
  • 方法1:遞歸先左後右
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution
{
public:
    vector<string> binaryTreePaths(TreeNode* root)
    {
        vector<string> ans;
        if(!root)
            return ans;
        if(root->left == NULL && root->right == NULL)
            ans.push_back(to_string(root->val));

        vector<string> leftS = binaryTreePaths(root->left);
        for(int i=0; i<leftS.size(); i++)
            ans.push_back(to_string(root->val) + "->" + leftS[i]);

        vector<string> rightS = binaryTreePaths(root->right);
        for(int i=0; i<rightS.size(); i++)
            ans.push_back(to_string(root->val) + "->" + rightS[i]);
        return ans;
    }
};
  • 方法2: 深度優先搜索(Depth-First-Search)
class Solution
{
private:
    vector<string> ans;
public:
    vector<string> binaryTreePaths(TreeNode* root)
    {
        if(!root)
            return ans;
        dfs(root, to_string(root->val));
        return ans;
    }
    void dfs(TreeNode* root, string str)
    {
        // 搜索完一個葉子節點,將數據存入容器
        if (root->left == NULL && root->right == NULL)
        {
            ans.push_back(str);
            return;
        }
        if(root->left != NULL)  // 防止越界取值
            dfs(root->left, str + "->" + to_string(root->left->val));
        if(root->right != NULL)
            dfs(root->right, str + "->" + to_string(root->right->val));
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章