# Leetcode [No.606] Construct String from Binary Tree (EASY) ## 題目 https://leetcode.com/problems/construct-string-from-binary-tree/description/?envType=daily-question&envId=2023-12-12 ## 思路 + 這個題目在描述的時候有一點問題,我也是看了討論區才知道題目想要幹嘛... + ![image](https://hackmd.io/_uploads/rynea2SLT.png) + 根據 `yogeshwarb`所描述的,我們只要在**有右子樹但無左子樹**的時候加一個()即可。 ```c++ /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: string tree2str(TreeNode* root) { string ans = ""; preorderTraverse(root, ans); return ans; } void preorderTraverse(TreeNode* node, string& ans) { if(node == nullptr) return; else { // cout << node->val; string str = to_string(node->val); ans+= str; if(node->left != nullptr) { // cout << "("; ans+= "("; preorderTraverse(node->left, ans); // cout << ")"; ans+=")"; } if(node->right != nullptr) { if(node->left == nullptr) { ans+="()"; } ans+="("; // cout << "("; preorderTraverse(node->right, ans); // cout << ")"; ans+=")"; } } } }; ``` ### 解法分析 + time complexity: O(lgn) // tree based ### 執行結果 ![image](https://hackmd.io/_uploads/S1qt3nSL6.png) --- ## 改良: + 改成沒那麼白癡的版本,把left的()加在preorderTraverse的外面 ```c++= /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: string tree2str(TreeNode* root) { string ans = ""; preorderTraverse(root, ans); return ans; } void preorderTraverse(TreeNode* node, string& ans) { if(node == nullptr) return; else { string str = to_string(node->val); ans+= str; if (node->left == nullptr && node->right == nullptr) { return; } else // there exist left or exist right { ans += "("; if(node->left) { preorderTraverse(node->left, ans); } ans += ")"; if(node->right) { ans += "("; preorderTraverse(node->right, ans); ans += ")"; } } } } }; ``` ### 執行結果 會稍微慢一些.. ![image](https://hackmd.io/_uploads/rymAAhSUa.png)