1. 程式人生 > >【資料結構】根據二叉樹建立字串

【資料結構】根據二叉樹建立字串

你需要採用前序遍歷的方式,將一個二叉樹轉換成一個由括號和整陣列成的字串。空節點則用一對空括號 "()" 表示。而且你需要省略所有不影響字串與原始二叉樹之間的一對一對映關係的空括號對。

示例 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)"

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

思路分析:

這道題雖然說看著複雜,但是處理起來依舊是遞迴子問題的方式,我們可以分為:首先把根轉換為字串,再去把左子樹轉換為字串,最後再把右子樹轉換為字串,需要注意的是:

①如果左子樹為空,右子樹不為空時,“()”不能省略,相反,如果左子樹不為空,右子樹為空時,括號則可省略;

②一開始給要放轉換為字串的字串陣列,記得一定要把陣列的第一個元素給初始化為“\0”;

③還有就是在轉換之前我們要先拼一個“(” 進去,轉換完之後,再拼一個“)” 進去。

具體程式碼如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
char valstr[30]={0};
void _tree2str(struct TreeNode* t,char* str){
 if(t==NULL)
 {
     return NULL;
 }
    sprintf(valstr,"%d",t->val);//把數字轉換為字串,好多人可能一開始想到使用itoa函式,
//但是itoa是用POSIX(一套可移植的介面)定義的,是非標準化的,容易出問題,所以就用sprintf來代替,建議少用itoa
    strcat(str,valstr);
    //走到這裡,根部分已轉換完畢
    if(t->left==NULL)
    {
        if(t->right==NULL)
        {
            return;
        }
        else
        {
            strcat(str,"()");//當左邊為空時,括號不能省略
        }
    }
    else//左邊不為空
    {
        strcat(str,"(");
        _tree2str(t->left,str);
        strcat(str,")");
    }
    //走到這裡表示左子樹已轉換完
    if(t->right==NULL)
    {
        return;
    }
    else
    {
        strcat(str,"(");
        _tree2str(t->right,str);
        strcat(str,")");
    }   
 }

char str[1000000];
char* tree2str(struct TreeNode* t) {
     str[0]='\0';
     _tree2str(t,str);
    
     return str;
}

注意:有的同學可能不太瞭解sprintf這個函式。這裡我簡單說明一下:sprintf的引數是一個可變引數列表,這裡引數的含義是:

int sprintf(char *str), const char *format(序列化為某種格式), ...)