C# leetcode 之 096 不同的二叉搜索树

题目描述

给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?

二叉搜索树定义

左子树上所有节点的值小于根节点, 右子树上左右节点的值大于根节点, 并且左右子树也为二叉搜索树

解题思路

根据二叉搜索树定义可知, 针对 1 .. n 的排序序列, 选取其中任意一个元素i则1到i-1的元素为左子树节点, i+1到n为右子树的节点. 题目中问的是一共有多少种二叉树, 所以其实不用关心二叉树中节点的值. 由此可知一个树只要节点数相同则生成的二叉搜索树的数量相同. 我们在求解的过程中可以将不同的节点数对应的二叉搜索树的数量存到一个字典中. 又因为前面提到的选取i后可以将问题划分为更小的问题. 所以符合动态规划的特性. 下面尝试使用动态规划进行分析.

我们假设 1 .. n 中包含的二叉树个数为 G(n) 则可得出公式

\[G(n) = \sum_{i=1}^{n} G(i - 1) * G(n - i)
\]

其中 i - 1 为左子树的元素个数, n - i为右子树的元素个数, 并且G(0)为0

代码实现

实现方式1: 迭代实现


public int NumTrees(int n)
{
var ar = new int[n + 1];
ar[0] = 1; for (var i = 1; i <= n; i++)
{
var count = 0;
for (var j = 1; j <= i; j++)
{
count += dic[j - 1] * dic[i - j];
}
dic[i] = count;
}
return dic[n];
}

实现方式2: 递归实现


private readonly IDictionary<int, int> _dic = new Dictionary<int, int>
{
[0] = 1
}; public int NumTrees(int n)
{
if (_dic.TryGetValue(n, out var val))
{
return val;
} var count = 0;
for (var i = 1; i <= n; i++)
{
count += NumTrees(i - 1) * NumTrees(n - i);
}
_dic[n] = count; return count;
}

C# leetcode 之 096 不同的二叉搜索树的更多相关文章

  1. Leetcode:96. 不同的二叉搜索树

    Leetcode:96. 不同的二叉搜索树 Leetcode:96. 不同的二叉搜索树 题目在链接中,点进去看看吧! 先介绍一个名词:卡特兰数 卡特兰数 卡特兰数Cn满足以下递推关系: \[ C_{n ...

  2. LeetCode 95 | 构造出所有二叉搜索树

    今天是LeetCode专题第61篇文章,我们一起来看的是LeetCode95题,Unique Binary Search Trees II(不同的二叉搜索树II). 这道题的官方难度是Medium,点 ...

  3. [LeetCode] Serialize and Deserialize BST 二叉搜索树的序列化和去序列化

    Serialization is the process of converting a data structure or object into a sequence of bits so tha ...

  4. [LeetCode] Binary Search Tree Iterator 二叉搜索树迭代器

    Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the ro ...

  5. LeetCode 109——有序链表转化二叉搜索树

    1. 题目 2. 解答 2.1. 方法一 在 LeetCode 108--将有序数组转化为二叉搜索树 中,我们已经实现了将有序数组转化为二叉搜索树.因此,这里,我们可以先遍历一遍链表,将节点的数据存入 ...

  6. [LeetCode] 109. 有序链表转换二叉搜索树

    题目链接 : https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/ 题目描述: 给定一个单链表,其中的 ...

  7. LeetCode 中级 - 有序链表转换二叉搜索树(109)

    给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定的有序链表: [-10 ...

  8. Leetcode题目96.不同的二叉搜索树(动态规划-中等)

    题目描述: 给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种? 示例: 输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 ...

  9. LeetCode 109. 有序链表转换二叉搜索树(Convert Sorted List to Binary Search Tree)

    题目描述 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定的有序链表: ...

随机推荐

  1. C语言入门-函数

    一.初见函数 求出1到10.20到30和35到45的三个的和 #include <stdio.h> // 定义一个函数 void sum(int begin, int end) { int ...

  2. 如何提高scroll事件的性能

    1. chrome devtool 是诊断页面滚动性能的有效工具 2. 提升滚动时性能,就是要达到fps高且稳. 3. 具体可以从以下方面着手 使用web worker分离无页面渲染无关的逻辑计算 触 ...

  3. C++ProtoBuf的安装与使用

    目录 安装(Ubuntu 16.04) 简介 proto2 proto3 用法 proto3 输出结果 总结 @(目录) 安装(Ubuntu 16.04) sudo apt-get install a ...

  4. SSM相关知识

    1.SpringMVC的工作流程? 1. 用户发送请求至前端控制器DispatcherServlet 2. DispatcherServlet收到请求调用HandlerMapping处理器映射器. 3 ...

  5. Curl的移植编译以及注意事项

    最近需要用curl来发送http请求,遇到了不少问题,查了不少资料,都是零零散散的,现在总结下.   1.移植编译 ./configure --prefix=$(PWD)/build --host=a ...

  6. B-概率论-熵和信息增益

    目录 熵和信息增益 一.熵(Entropy) 二.条件熵(Conditional Entropy) 三.联合熵(Joint Entropy) 四.相对熵(Relative Entropy) 4.1 相 ...

  7. 基于Matlab/Simulink的模型开发(连载一)

    概述 基于模型的开发将省去繁琐的代码编写步骤,只需要拖动几个模块,就像搭积木一般,轻松搭建您自己的飞控算法.飞控开发人员可以将更多的精力放在算法本身,而不需要过多关注代码实现的细节,这样将大大加快开发 ...

  8. MySQL 5.7安装(多实例)最佳实践

    MySQL 5.7安装(多实例)最佳实践,接上一篇<MySQL 5.7安装最佳实践>在已有的实例上面新增一个实例,主要是为了资源合理利用:下面是具体的步骤: 1.新实例目录规划,my.cn ...

  9. Win10实现多用户同时进行远程桌面连接的解决方案

    Win10无法实现多用户远程桌面连接的解决方案以下方法解决Win10无法同时多用户登录.推荐:win10正式版下载 以下为必要步骤需先进行组策略设置,完成后再选择方法1或2(推荐方法2): 远程桌面连 ...

  10. 微信小程序中事件

    微信小程序中事件 一.常见的事件有 类型 触发条件 最低版本 touchstart 手指触摸动作开始 touchmove 手指触摸后移动 touchcancel 手指触摸动作被打断,如来电提醒,弹窗 ...