法一
/**
* dfs构造BST森林
* BST左子树的值一定小于右子树的值
*
* @param left
* @param right
* @return
*/
private List<TreeNode> dfs(int left, int right) {
List<TreeNode> forest = new LinkedList<>();
if (left > right) { // 无法产生子树
forest.add(null);
return forest;
}
for (int i = left; i <= right; i++) { // 遍历连续的整数序列[left, right]
List<TreeNode> leftTreeList = dfs(left, i - 1); // i左边的序列可以作为以i为根节点的BST的左子树
List<TreeNode> rightTreeList = dfs(i + 1, right); // i右边的序列可以作为以i为根节点的BST的右子树
for (TreeNode leftTree : leftTreeList) { // 左右子树不止一个,故每次在左右子树中各挑一个组成一棵完整的树
for (TreeNode rightTree : rightTreeList) {
forest.add(new TreeNode(i, leftTree, rightTree)); // 构建以当前i为根结点的BST,并加入森林
}
}
}
return forest;
}
/**
* 法一(dfs)
*
* @param n
* @return
*/
public List<TreeNode> generateTrees(int n) {
if (n > 0) {
return dfs(1, n);
} else {
return new LinkedList<>();
}
}
本地测试
/**
* 95. 不同的二叉搜索树 II
*/
lay.showTitle(95);
Solution95 sol95 = new Solution95();
List<TreeNode> forest95 = sol95.generateTrees(3);
for (TreeNode tree : forest95) {
treeOpt.layerOrder(tree);
}
原文地址:https://www.jb51.cc/wenti/3281665.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。