题目
官方解
简要改自官网解。
利用树的遍历,以递归方式实现不同二叉树的构造。
我们从序列 \(1 ...n\) 中取出数字 \(i\),作为当前树的树根。于是,剩余 \(i - 1\) 个元素可用于左子树,\(n - i\) 个元素用于右子树。 如 前文所述,这样会产生 \(G(i - 1)\) 种左子树 和 \(G(n - i)\) 种右子树,其中 \(G\) 是卡特兰数。
现在,我们对序列 \(1 ... i - 1\) 重复上述过程,以构建所有的左子树;然后对 \(i + 1 ... n\) 重复,以构建所有的右子树。
这样,我们就有了树根 \(i\) 和可能的左子树、右子树的列表。
最后一步,对两个列表循环,将左子树和右子树连接在根上。
C++实现
1 | /** |
Java实现
1 | class Solution { |