95.不同的二叉搜索树
题面:
给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。
示例:
先代码
class Solution {
public List<TreeNode> generateTrees(int n) {
if(n==0)return new ArrayList<TreeNode>();
return generate(1,n);
}
public List<TreeNode> generate(int start,int end){
List<TreeNode> allTrees=new ArrayList<>();
if(start>end){
allTrees.add(null);
return allTrees;
}
for(int i = start; i<=end; i++){
List<TreeNode> leftTrees=generate(start,i-1);
List<TreeNode> rightTrees=generate(i+1,end);
for(TreeNode leftNode : leftTrees){
for(TreeNode rightNode : rightTrees){
TreeNode currentNode=new TreeNode(i);
currentNode.left=leftNode;
currentNode.right=rightNode;
allTrees.add(currentNode);
}
}
}
return allTrees;
}
}
笔记记录:
关键在于
for(int i = start; i<=end; i++){
List<TreeNode> leftTrees=generate(start,i-1);
List<TreeNode> rightTrees=generate(i+1,end);
for(TreeNode leftNode : leftTrees){
for(TreeNode rightNode : rightTrees){
TreeNode currentNode=new TreeNode(i);
currentNode.left=leftNode;
currentNode.right=rightNode;
allTrees.add(currentNode);
}
}
}
这里第一个for循环是枚举
枚举当前所在节点对应的数字。
leftTrees,rightTrees表示的是左子树与右子树的所有可能子树(递归先不关心)
然后建立一个当前的节点,这节点需要在两个for循环内部创立,以保证他们不是同一个对象。
各自枚举出左右子树的任一可能子树,然后将二者连接起来。
然后加入最后需要返回的子树序列中。