本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务。本期训练营采用分类别练习的模式,即选择了五个知识点(数组、链表、字符串、树、贪心算法),每个知识点选择了 三个简单、两个中等、一个困难 等级的题目,共计三十道题,利用三十天的时间完成这组刻意练习。
本次任务的知识点:树
树 是一种抽象数据类型(ADT)或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由 n(n>0)
个有限节点组成的一个具有层次关系的集合。
把它叫做「树」是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
它具有以下的特点:
- 题号:95
- 难度:中等
- https://leetcode-cn.com/problems/unique-binary-search-trees-ii/
给定一个整数 n,生成所有由 1 … n 为节点所组成的二叉搜索树。
示例:
输入: 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
第一种:递归
如果将i
作为根节点,那么[1, i-1]
为i
的左子树节点,[i+1, n]
为右子树节点。
问题就被拆分为两个子问题了:
i
的左子树i
的右子树递归终止条件:
以上就是利用递归求解该问题的思路。
/**
* 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:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def generateTrees(self, n: int) -> List[TreeNode]:
if n == 0:
return list()
return self.generate(1, n)
def generate(self, start: int, end: int) -> List[TreeNode]:
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
往期活动
LSGO软件技术团队会定期开展提升编程技能的刻意练习活动,希望大家能够参与进来一起刻意练习,一起学习进步!
我是 终身学习者“老马”,一个长期践行“结伴式学习”理念的 中年大叔。
我崇尚分享,渴望成长,于2010年创立了“LSGO软件技术团队”,并加入了国内著名的开源组织“Datawhale”,也是“Dre@mtech”、“智能机器人研究中心”和“大数据与哲学社会科学实验室”的一员。
愿我们一起学习,一起进步,相互陪伴,共同成长。
后台回复「搜搜搜」,随机获取电子资源!
欢迎关注,请扫描二维码: