1. 程式人生 > >606. 根據二叉樹建立字串

606. 根據二叉樹建立字串

你需要採用前序遍歷的方式,將一個二叉樹轉換成一個由括號和整陣列成的字串。

空節點則用一對空括號 "()" 表示。而且你需要省略所有不影響字串與原始二叉樹之間的一對一對映關係的空括號對。

示例 1:

輸入: 二叉樹: [1,2,3,4]
       1
     /   \
    2     3
   /    
  4     

輸出: "1(2(4))(3)"

解釋: 原本將是“1(2(4)())(3())”,
在你省略所有不必要的空括號對之後,
它將是“1(2(4))(3)”。

示例 2:

輸入: 二叉樹: [1,2,3,null,4]
       1
     /   \
    2     3
     \  
      4 

輸出:
"1(2()(4))(3)" 解釋: 和第一個示例相似, 除了我們不能省略第一個對括號來中斷輸入和輸出之間的一對一對映關係。

 

思路:

如果父節點為空,則直接返回空串

如果父節點不為空,那麼就把父節點的值加到字串s中

再判斷左右子樹是否為空:

左空、右不空:返回s+"()"+"("+tree2str(t->right)+")"

左空、右空:返回s

左不空、右空:返回s+"("+tree2str(t->right)+")"

左不空、右不空:返回s++"("+tree2str(t->left)+")"+"("+tree2str(t->right)+")"

 

寫程式碼時邏輯可以優化一下,變成先後判斷,優化後代碼如下:

/**
 * 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:
    string tree2str(TreeNode* t) {
        if(t)
        {
            string s;
            s+=to_string(t->val);
            if(t->left)
            {
                s+="(";
                s+=tree2str(t->left);
                s+=")";
            }
            else
            {
                if(t->right)
                    s+="()";
            }
            if(t->right)
            {
                s+="(";
                s+=tree2str(t->right);
                s+=")";
            }
            return s;
        }
        else
            return "";
    }
};