題目地址:
https://www.lintcode.com/problem/construct-string-from-binary-tree/description
參考https://blog.csdn.net/qq_46105170/article/details/106185007。這裏採取DFS有返回值的寫法:
public class Solution {
/**
* @param root: the root of tree
* @return: return a string
*/
public String tree2str(TreeNode root) {
// write your code here
return dfs(root).toString();
}
private StringBuilder dfs(TreeNode root) {
StringBuilder sb = new StringBuilder();
// 空樹則直接返回空串
if (root == null) {
return sb;
}
// 非空樹則先append樹根
sb.append(root.val);
// 若走到葉子,則左右子樹都是空樹,不用append任何括號,返回sb
if (root.left == null && root.right == null) {
return sb;
}
// 如果不是葉子,那麼左子樹的括號是一定要加的
sb.append('(').append(dfs(root.left)).append(')');
// 接着判斷右子樹是否非空,非空的時候才append括號,然後繼續DFS
if (root.right != null) {
sb.append('(').append(dfs(root.right)).append(')');
}
return sb;
}
}
class TreeNode {
int val;
TreeNode left, right;
TreeNode(int x) {
val = x;
}
}
時空複雜度,遞歸棧深度是樹高,但sb
需要空間。