题目

类型:树

image.png

解题思路

生成字符串的规则其实就是在「前序遍历」输出节点值的同时,在每颗子树的左右添加一对 ()(根节点除外),同时需要忽略掉一些不必要的 () 。

所谓的不必要就是指当以某个节点 x 为根时,其只「有左子树」而「没有右子树」时,右子树的 () 可被忽略,或者「左右子树都没有」时,两者的 () 可被忽略。

或者反过来说,如果对于每个非空节点才添加 () 的话,那么当「有右子树」同时「没有左子树」时,左子树的 () 不能被忽略,需要额外添加,从而确保生成出来的字符串能够与「有左子树」同时「没有右子树」的情况区分开来,而不会产生二义性。

代码

  1. class Solution {
  2. StringBuilder sb = new StringBuilder();
  3. public String tree2str(TreeNode root) {
  4. dfs(root);
  5. return sb.substring(1, sb.length() - 1);
  6. }
  7. void dfs(TreeNode root) {
  8. sb.append("(");
  9. sb.append(root.val);
  10. if (root.left != null) dfs(root.left);
  11. else if (root.right != null) sb.append("()");
  12. if (root.right != null) dfs(root.right);
  13. sb.append(")");
  14. }
  15. }