你需要採用前序遍歷的方式,將乙個二叉樹轉換成乙個由括號和整數組成的字串。空節點則用一對空括號 "()" 表示。而且你需要省略所有不影響字串與原始二叉樹之間的一對一對映關係的空括號對。
示例 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 ;
*/char valstr[30]=;
void _tree2str(struct treenode* t,char* str)
sprintf(valstr,"%d",t->val);//把數字轉換為字串,好多人可能一開始想到使用itoa函式,
//但是itoa是用posix(一套可移植的介面)定義的,是非標準化的,容易出問題,所以就用sprintf來代替,建議少用itoa
strcat(str,valstr);
//走到這裡,根部分已轉換完畢
if(t->left==null)
else
}else//左邊不為空
//走到這裡表示左子樹已轉換完
if(t->right==null)
else
}char str[1000000];
char* tree2str(struct treenode* t)
注意:有的同學可能不太了解sprintf這個函式。這裡我簡單說明一下:sprintf的引數是乙個可變引數列表,這裡引數的含義是:
int sprintf(char *str), const char *format(序列化為某種格式), ...)
詳細解析可參考:
可變引數列表的講解可參考:
根據二叉樹建立字串
你需要採用前序遍歷的方式,將乙個二叉樹轉換成乙個由括號和整數組成的字串。空節點則用一對空括號 表示。而且你需要省略所有不影響字串與原始二叉樹之間的一對一對映關係的空括號對。示例 1 輸入 二叉樹 1 2,3 4 1 23 4 輸出 1 2 4 3 解釋 原本將是 1 2 4 3 在你省略所有不必要的...
根據二叉樹建立字串
你需要採用前序遍歷的方式,將乙個二叉樹轉換成乙個由括號和整數組成的字串。空節點則用一對空括號 表示。而且你需要省略所有不影響字串與原始二叉樹之間的一對一對映關係的空括號對。示例 1 輸入 二叉樹 1,2,3,4 1 23 4輸出 1 2 4 3 解釋 原本將是 1 2 4 3 在你省略所有不必要的空...
演算法 根據二叉樹建立字串
本題 於 606.根據二叉樹建立字串。是乙個easy型別的題,但是卻對我們掌握遞迴思想有很大的幫助。有人說,理解遞迴,首先要理解遞迴。可見遞迴思想並不是那麼直白,需要我們自己去理解。遞迴就是乙個不斷呼叫自身的乙個過程,並且隨著遞迴深度增加,鎖解決的問題越來越小,當滿足遞迴終止條件之後,解決的小問題拼...