面试题22:有序数组生成不同结构BST
- 对于一个含有n个数的有序数组1~N,能够产生多少种不同结果的二叉搜素树BST?
- 如何生成这些不同结构的BST?
- 有序数组如何生成平衡二叉搜索树?
class Solution {
public:
int numTrees(int n) {
int* dp = new int[n+];
dp[] = ;
dp[] = ;
dp[] = ;
for(int i=;i<=n;i++){
dp[i] = ;
for(int j=;j<=i;j++){
dp[i]+=dp[j-]*dp[i-j];
}
}
return dp[n];
} int numTrees2(int n){
if(n==) return ;
if(n < ) return n;
int sum = ;
for(int i=;i<=n;i++){
sum += numTrees2(i-)*numTrees2(n-i);
}
return sum;
}
};
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/ class Solution {
public:
vector<TreeNode *> generateTrees(int left, int right) {
vector<TreeNode*> res;
if (left > right) {
res.push_back(nullptr);
return res;
} if(left == right){
res.push_back(new TreeNode(left));
return res;
} for (int i = left; i <= right; i++) {
//TreeNode* root = new TreeNode(i);
vector<TreeNode*> leftRes = generateTrees(left, i-);
vector<TreeNode*> rightRes = generateTrees(i + , right);
for (size_t j = ; j < leftRes.size(); j++) {
for (size_t k = ; k < rightRes.size(); k++) {
TreeNode* root = new TreeNode(i);
root->left = leftRes[j];
root->right = rightRes[k];
res.push_back(root);
}
}
}
return res;
} vector<TreeNode*> generateTrees(int n){
vector<TreeNode*> res;
if(n == ) {
res.push_back(nullptr);
return res;
}
return generateTrees(,n);
} };
面试题22:有序数组生成不同结构BST的更多相关文章
- 【IT笔试面试题整理】有序数组生成最小高度二叉树
[试题描述]定义一个函数,输入一个有序数组生成最小高度二叉树 We will try to create a binary tree such that for each node, the numb ...
- MySQL 索引结构 hash 有序数组
MySQL 索引结构 hash 有序数组 除了最常见的树形索引结构,Hash索引也有它的独到之处. Hash算法 Hash本身是一种函数,又被称为散列函数. 它的思路很简单:将key放在数组里,用 ...
- LeetCode:将有序数组转换为二叉搜索树【108】
LeetCode:将有序数组转换为二叉搜索树[108] 题目描述 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差 ...
- 有序线性表(存储结构数组)--Java实现
/*有序数组:主要是为了提高查找的效率 *查找:无序数组--顺序查找,有序数组--折半查找 *其中插入比无序数组慢 * */ public class MyOrderedArray { private ...
- 面试题:合并2个有序数组(leetcode88)
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n. ...
- 两个有序数组合并成一个有序数组(要求时间复杂度为O(n))
面试题: 怎样把两个有序数组合并成有序数组呢 逻辑步骤: 1.假设两个数组为A和B 2.A和B都是从小到大的顺序进行排列 ** 1.我们可以直接比较两个数组的首元素,哪个小就把这个小元素放入可变数组. ...
- C语言实现顺序表的基本操作(从键盘输入 生成线性表,读txt文件生成线性表和数组生成线性表----三种写法)
经过三天的时间终于把顺序表的操作实现搞定了.(主要是在测试部分停留了太长时间) 1. 线性表顺序存储的概念:指的是在内存中用一段地址连续的存储单元依次存储线性表中的元素. 2. 采用的实现方式:一段地 ...
- PTA 有序数组的插入
6-5 有序数组的插入 (20 分) 本题要求将任一给定元素插入从大到小排好序的数组中合适的位置,以保持结果依然有序. 函数接口定义: bool Insert( List L, ElementTy ...
- [LeetCode] Median of Two Sorted Arrays 两个有序数组的中位数
There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...
随机推荐
- Java对象的serialVersion序列化和反序列化
Java基础学习总结——Java对象的序列化和反序列化 一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种 ...
- python 查找字符串同时包含数字和字母的最长子字符串的几种实现方法
有个字符串$sd1#111$svda123!!!221&eSSDSDG,包含特殊字符.数字和字母,输出最长的子字符串和他的长度 例如上面的字符串同时包含数字和字母的字符串是svda123,长度 ...
- C#委托和事件的使用的意义
转载自:https://www.cnblogs.com/yinqixin/p/5056307.html 每一个初学C#的程序猿,在刚刚碰到委托和事件的概念时,估计都是望而却步,茫然摸不到头脑的.百度一 ...
- NetCore入门篇:(二)Net Core项目创建
一.新建项目 1.选择菜单:文件 -> 新建 -> 项目 2.选择模板:NET Core -> ASP.NET Core Web 应用程序,输入名称 3.选择框架:ASP.NET C ...
- Null类型的DateTime怎么用在TimeSpan上!
太TM简单了.. DateTime ts1 = Convert.ToDateTime(workinfo.WorkTime.ToString()); DateTime ts2 = Convert.ToD ...
- java 处理json格式数据中的转义斜杠
1.{\"Count\":\"3\",\"ErrorString\":\"\",\"Success\" ...
- Golang 实现守护主进程
package main import ( "fmt" "runtime" "sync" "time" ) func t ...
- FunDA(6)- Reactive Streams:Play with Iteratees、Enumerator and Enumeratees
在上一节我们介绍了Iteratee.它的功能是消耗从一些数据源推送过来的数据元素,不同的数据消耗方式代表了不同功能的Iteratee.所谓的数据源就是我们这节要讨论的Enumerator.Enumer ...
- spring-security(2)
记录一下spring security的配置 配置详解 <?xml version="1.0" encoding="UTF-8"?> <bea ...
- ubuntu 16.04 安装Tensorflow
ubuntu 16.04 安装Tensorflow(CPU) 安装python ubuntu 16.04自带python2.7,因此可以略过这一步 安装pip sudo apt-get install ...