题目:不同的二叉搜索树II
- 题号:95
- 难度:中等
- https://leetcode-cn.com/problems/unique-binary-search-trees-ii/
给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。
示例1:
输入:n = 3
输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]
示例2:
输入:n = 1
输出:[[1]]
提示:
- 1 <= n <= 8
实现
思路:递归。
如果将i
作为根节点,那么[1, i-1]
为i
的左子树节点,[i+1, n]
为右子树节点。
问题就被拆分为两个子问题了:
- 求左区间构成的所有二叉搜索树作为
i
的左子树 - 求右区间构成的所有二叉搜索树作为
i
的右子树
递归终止条件:
- 区间为空,返回null。
- 区间的左右端点相同,即只包含一个数,返回该数构成的根结点。
以上就是利用递归求解该问题的思路。
C# 语言
/**
* Definition for a binary tree node.
* public class TreeNode {
* public int val;
* public TreeNode left;
* public TreeNode right;
* public TreeNode(int x) { val = x; }
* }
*/
public class Solution
{
public IList<TreeNode> GenerateTrees(int n)
{
if (n == 0)
{
return new List<TreeNode>();
}
return GenerateTrees(1, n);
}
public List<TreeNode> GenerateTrees(int start, int end)
{
List<TreeNode> lst = new List<TreeNode>();
//此时没有数字,将 null 加入结果中
if (start > end)
{
lst.Add(null);
return lst;
}
//只有一个数字,当前数字作为一棵树加入结果中
if (start == end)
{
TreeNode tree = new TreeNode(start);
lst.Add(tree);
return lst;
}
//尝试每个数字作为根节点
for (int i = start; i <= end; i++)
{
//得到所有可能的左子树
List<TreeNode> leftTrees = GenerateTrees(start, i - 1);
//得到所有可能的右子树
List<TreeNode> rightTrees = GenerateTrees(i + 1, end);
//左子树右子树两两组合
foreach (TreeNode leftTree in leftTrees)
{
foreach (TreeNode rightTree in rightTrees)
{
TreeNode root = new TreeNode(i);
root.left = leftTree;
root.right = rightTree;
//加入到最终结果中
lst.Add(root);
}
}
}
return lst;
}
}
Python 语言
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def generateTrees(self, n):
"""
:type n: int
:rtype: List[TreeNode]
"""
if n == 0:
return list()
return self.generate(1, n)
def generate(self, start, end):
lst = list()
if start > end:
lst.append(None)
return lst
if start == end:
tree = TreeNode(start)
lst.append(tree)
return lst
for i in range(start, end + 1):
leftTrees = self.generate(start, i - 1)
rightTrees = self.generate(i + 1, end)
for leftTree in leftTrees:
for rightTree in rightTrees:
tree = TreeNode(i)
tree.left = leftTree
tree.right = rightTree
lst.append(tree)
return lst