寫在前面
題目詳情
給定一個二叉樹,返回所有從根節點到葉子節點的路徑。
說明: 葉子節點是指沒有子節點的節點。
示例:
輸入:
1
/ \
2 3
\
5
輸出: ["1->2->5", "1->3"]
解釋: 所有根節點到葉子節點的路徑爲: 1->2->5, 1->3
ac代碼
- 解題思想
- 遞歸迭代
for
循環逆序拼裝(左右均可能有多個路徑)
遞歸迭代變量、數組值/大小關係!!!
方法1:
遞歸先左後右
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));
}
};