題目連接 : https://leetcode-cn.com/problems/unique-binary-search-trees-ii/java
給定一個整數 n,生成全部由 1 ... n 爲節點所組成的二叉搜索樹。node
輸入: 3 輸出: [ [1,null,3,2], [3,2,null,1], [3,1,null,null,2], [2,1,3], [1,null,2,null,3] ] 解釋: 以上的輸出對應如下 5 種不一樣結構的二叉搜索樹: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
二叉搜索樹, 一節點大於左子樹節點, 小於右子樹節點python
因此咱們節點是從1
到n
,當一個節點爲val
那麼它的左邊是< val
,右邊是>val
,app
咱們用遞歸解決!spa
# Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None import functools class Solution: def generateTrees(self, n: int) -> List[TreeNode]: if n == 0: return [] @functools.lru_cache(None) def helper(start, end): res = [] if start > end: res.append(None) for val in range(start, end + 1): for left in helper(start, val - 1): for right in helper(val + 1, end): root = TreeNode(val) root.left = left root.right = right res.append(root) return res return helper(1, n)
javacode
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public List<TreeNode> generateTrees(int n) { if (n == 0) return new ArrayList<>(); return helper(1, n); } private List<TreeNode> helper(int start, int end) { List<TreeNode> res = new ArrayList<>(); if (start > end) { res.add(null); return res; } for (int val = start; val <= end; val++) { List<TreeNode> left = helper(start, val - 1); List<TreeNode> right = helper(val + 1, end); for (TreeNode l : left) { for (TreeNode r : right) { TreeNode root = new TreeNode(val); root.left = l; root.right = r; res.add(root); } } } return res; } }