# 题目描述

## 思路分析

### 递归

1. 当前节点为null时，return "";
2. 左右节点均无：return String.valueOf(root.val);
3. 只存在左节点：return root.val + "(" + solution(root.left) + ")";
4. 只存在右节点： return root.val + "()(" + solution(root.left) + ")";
5. 左右节点均存在：return root.val + "(" + solution(root.left) + ")(" + solution(root.right) + ")";

        if (root == null) {
return "";
}

if(root.right == null){
if(root.left == null)
return String.valueOf(root.val);
else
return root.val
+ "("
+ solutionRecursive(root.left)
+ ")";
}

// root.left != null && root.right != null
return root.val
+ "("
+ solutionRecursive(root.left)
+ ")("
+ solutionRecursive(root.right)
+ ")";


### 迭代

Stack<TreeNode> stack = new Stack<>();
HashSet<TreeNode> visitedSet = new HashSet<>();
StringBuilder res = new StringBuiler();

stack.push(root);

while(!stack.empty()){
TreeNode node = stack.peek();
if(visitedSet.contains(node)){
stack.pop();
res.append(")");
}else{
res.append("(" + node.val);

if(node.left == null && node.right != null)
res.append("()");

if(node.right != null) // attention here !!!!
stack.push(node.right);
if(node.left!= null)
stack.push(node.left);
}
}

return res.subString(1, res.length() - 1);


## 解题代码

### 1. 递归

    public static String solutionRecursive(TreeNode root) {
if (root == null) {
return "";
}

if(root.right == null){
if(root.left == null)
return String.valueOf(root.val);
else
return root.val
+ "("
+ solutionRecursive(root.left)
+ ")";
}

// root.left != null && root.right != null
return root.val
+ "("
+ solutionRecursive(root.left)
+ ")("
+ solutionRecursive(root.right)
+ ")";

}


### 2. 迭代

    public static String solutionIterative(TreeNode root){
if(root == null) return "";

StringBuilder res = new StringBuilder();
HashSet<TreeNode> visitedSet = new HashSet<>();
Stack<TreeNode> stack = new Stack<>();

stack.push(root);

while(!stack.empty()){
TreeNode node = stack.peek();
if(visitedSet.contains(node)){
res.append(")");
stack.pop();
}else{
res.append("(" + node.val);

if(node.left == null && node.right != null)
res.append("()");
if(node.right != null)
stack.push(node.right);
if(node.left != null)
stack.push(node.left);

}
}
return res.substring(1, res.length() - 1);

}


## 复杂度分析

1. 递归

1. 迭代
时间复杂度： 时间复杂度为O(n);
空间复杂度： 我们这里借助了stack, visited，以及返回结果res，最坏情况下为3n，故空间复杂度为O(n);

## Github源码

05-23 165

07-22 108

12-26 62万+

07-02 1191

03-21 85

08-22 733

04-12 201

04-28 53

05-21 4442

11-07 468

#### 百度面试两板斧：手写算法问基础

©️2020 CSDN 皮肤主题: 程序猿惹谁了 设计师: 上身试试

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、C币套餐、付费专栏及课程。