这题明显可以使用dfs解决
分析递推公式:
1.当只有一个节点时,直接返回该节点
2.当有两个节点时
两种情况:1.小节点在上,右孩子为大节点
2.大节点在上,左孩子为小节点
3.当有三个节点时
三种情况:
1.最小的节点在上,中等和最大的节点按照第二种方法排序
2.中间节点在上,左右分别按照第一种方法
3.最大的节点在上,左节点按照第二种方法排序
以此类推,当n个节点时遍历n,当第i个节点作为根节点时,左边为i-1个节点的排序方法,右边为n-i种方法。
最终代码
class Solution {
public List<TreeNode> generateTrees(int n) {
return dfs(1,n);
}
public List<TreeNode> dfs(int start,int end) {
if(end - start + 1 == 1) {
ArrayList<TreeNode> nodeList = new ArrayList<TreeNode>();
nodeList.add(new TreeNode(end));
return nodeList;
}
if(end - start + 1 == 2) {
ArrayList<TreeNode> nodeList = new ArrayList<TreeNode>();
TreeNode node1 = new TreeNode(start);
TreeNode node2 = new TreeNode(start + 1);
node1.right = node2;
nodeList.add(node1);
TreeNode node3 = new TreeNode(start);
TreeNode node4 = new TreeNode(start + 1);
node4.left = node3;
nodeList.add(node4);
return nodeList;
}
ArrayList<TreeNode> nodeList = new ArrayList<TreeNode>();
for(int i = start; i <= end; i++) {
if(i == start) {
List<TreeNode> nodeListStart = dfs(start + 1,end);
for(int j = 0;j < nodeListStart.size();j++) {
TreeNode node = new TreeNode(start);
node.right = nodeListStart.get(j);
nodeList.add(node);
}
}else if(i == end) {
List<TreeNode> nodeListEnd = dfs(start,end - 1);
for(int j = 0;j < nodeListEnd.size();j++) {
TreeNode node = new TreeNode(end);
node.left = nodeListEnd.get(j);
nodeList.add(node);
}
}else {
List<TreeNode> nodeListStart = dfs(start,i - 1);
List<TreeNode> nodeListEnd = dfs(i + 1,end);
for(int j = 0; j < nodeListStart.size();j++) {
for(int k = 0; k < nodeListEnd.size();k++) {
TreeNode node = new TreeNode(i);
node.left = nodeListStart.get(j);
node.right = nodeListEnd.get(k);
nodeList.add(node);
}
}
}
}
return nodeList;
}
}