题目
官方
递归实现
考虑4种情况:
- 如果当前节点有两个孩子,那我们在递归时,需要在两个孩子的结果外都加上一层括号;
- 如果当前节点没有孩子,那我们不需要在节点后面加上任何括号;
- 如果当前节点只有左孩子,那我们在递归时,只需要在左孩子的结果外加上一层括号,而不需要给右孩子加上任何括号;
- 如果当前节点只有右孩子,那我们在递归时,需要先加上一层空的括号
()
表示左孩子为空,再对右孩子进行递归,并在结果外加上一层括号。
java实现
1 | /** |
改下排版
1 | public class Solution { |
C++实现
1 | /** |
非递归手动压栈
- 因为要保存括号,所以需要一个集合存储所有遍历过的节点
- 它没有子节点,什么都不做
- 有两个节点,右孩子先入栈,再左孩子入栈,保证先序遍历顺序
- 如果只有左孩子,则左孩子入栈
- 如果只有右孩子,则末尾添加一个
()
后,再将右孩子入栈
java实现
1 | public class Solution { |
C++实现
1 | /** |
\[ \begin{align*} & e.g. \\ & INPUT: & [1,2,3,4] \\ & OUTPUT: & (1\\ & & (1(2\\ & &(1(2(4\\ & &(1(2(4)\\ & &(1(2(4)) \\ & &(1(2(4))(3\\ & &(1(2(4))(3)\\ & &(1(2(4))(3))\\ \end{align*} \]
MrHuang
- 用
stringstream
代替string
- 用
lambda
表达式代替函数
1 | class Solution { |
References
https://leetcode-cn.com/problems/construct-string-from-binary-tree/solution/gen-ju-er-cha-shu-chuang-jian-zi-fu-chuan-by-leetc/
https://leetcode-cn.com/problems/construct-string-from-binary-tree/solution/cgao-xiao-di-cun-fang-fa-by-mrhuang-3/
https://stackoverflow.com/questions/1701067/how-to-check-that-an-element-is-in-a-stdset