[LeetCode] 95. Unique Binary Search Trees II 唯一二叉搜索树 II
Given n, generate all structurally unique BST's (binary search trees) that store values 1...n.
For example,
Given n = 3, your program should return all 5 unique BST's shown below.
1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
confused what "{1,#,2,3}"
means? > read more on how binary tree is serialized on OJ.
The serialization of a binary tree follows a level order traversal, where '#' signifies a path terminator where no node exists below.
Here's an example:
1 / \ 2 3 / 4 \ 5The above binary tree is serialized as
"{1,2,3,#,#,4,#,#,5}"
.96. Unique Binary Search Trees 的扩展,96题只要算出所有不同BST的个数,这道题让把那些二叉树都表示出来。
用递归来解,划分左右子树,递归构造。
1. 根节点可以任取min ~ max (例如min = 1, max = n),假如取定为i。
2. 则left subtree由min ~ i-1组成,假设可以有L种可能。right subtree由i+1 ~ max组成,假设有R种可能。生成所有可能的left/right subtree。
3 对于每个生成的left subtree/right subtree组合<T_left(p), T_right(q)>,p = 1...L,q = 1...R,添加上根节点i而组成一颗新树。
Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | class TreeNode: def __init__( self , x): self .val = x self .left = None self .right = None def __repr__( self ): if self : serial = [] queue = [ self ] while queue: cur = queue[ 0 ] if cur: serial.append(cur.val) queue.append(cur.left) queue.append(cur.right) else : serial.append( "#" ) queue = queue[ 1 :] while serial[ - 1 ] = = "#" : serial.pop() return repr (serial) else : return None class Solution: # @return a list of tree node def generateTrees( self , n): return self .generateTreesRecu( 1 , n) def generateTreesRecu( self , low, high): result = [] if low > high: result.append( None ) for i in xrange (low, high + 1 ): left = self .generateTreesRecu(low, i - 1 ) right = self .generateTreesRecu(i + 1 , high) for j in left: for k in right: cur = TreeNode(i) cur.left = j cur.right = k result.append(cur) return result |
C++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | class Solution { public : vector<TreeNode *> generateTrees( int n) { return genBST(1, n); } vector<TreeNode *> genBST( int min, int max) { vector<TreeNode *> ret; if (min>max) { ret.push_back(NULL); return ret; } for ( int i=min; i<=max; i++) { vector<TreeNode*> leftSubTree = genBST(min,i-1); vector<TreeNode*> rightSubTree = genBST(i+1,max); for ( int j=0; j<leftSubTree.size(); j++) { for ( int k=0; k<rightSubTree.size(); k++) { TreeNode *root = new TreeNode(i); root->left = leftSubTree[j]; root->right = rightSubTree[k]; ret.push_back(root); } } } return ret; } }; |
类似题目:
[LeetCode] 96. Unique Binary Search Trees 唯一二叉搜索树
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构