算法-根據二叉樹創建字符串
1、根據二叉樹創建字符串
本題來源於:606. 根據二叉樹創建字符串。是一個easy類型的題,但是卻對我們掌握遞歸思想有很大的幫助。
有人說,理解遞歸,首先要理解遞歸。。。可見遞歸思想並不是那麼直白,需要我們自己去理解。
遞歸就是一個不斷調用自身的一個過程,並且隨着遞歸深度增加,鎖解決的問題越來越小,當滿足遞歸終止條件之後,解決的小問題拼合成最終的結果。簡而言之,遞歸是一個將問題化整爲零,然後又化零爲整的一個過程。可以想象一下歸併排序的原理,就是這樣一個過程。
先看一下題目描述:
你需要採用前序遍歷的方式,將一個二叉樹轉換成一個由括號和整數組成的字符串。
空節點則用一對空括號 "()" 表示。而且你需要省略所有不影響字符串與原始二叉樹之間的一對一映射關係的空括號對。
示例 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)"
解釋: 和第一個示例相似,
除了我們不能省略第一個對括號來中斷輸入和輸出之間的一對一映射關係。
對於本題如何應用遞歸呢?我們可以將其化爲5種簡單情況:
- 本身爲空
- 左子樹爲空且右子樹爲空
- 左子樹非空且右子樹爲空
- 左子樹爲空且右子樹非空
- 都不爲空
對於情況1,我們返回的顯然是 “”
對於情況2,我們返回的顯然是 node.val
對於情況3,根據示例1的規則,左非空的結論是node.val+"("+遞歸(node.left)+")";
對於情況4,我們得出的結論是:node.val+"("+遞歸(node.left)+")"+"("+遞歸(node.right)+")"
對於情況5,則和情況四相同,不過我們要做的不再是遞歸,而是返回整個字串。
於是,已經能夠將問題拆解爲四種情形。只需要在遞歸代碼中實現就好了。
public String tree2str(TreeNode t) {
if(t==null){//情況1
return "";
}
if(t.left==null&&t.right==null){//情況2
return t.val+"";
}
if(t.right==null){//情況3
return t.val+"("+tree2str(t.left)+")";
}
//情況4、5
return t.val+"("+tree2str(t.left)+")("+tree2str(t.right)+")";
}