创作

完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>

3天内不再提示

二叉树上应该怎么求

85xj_TheAlgorit 来源:代码随想录 作者:程序员Carl 2021-11-22 11:32 次阅读

二叉树上应该怎么求,二叉搜索树上又应该怎么求?

在求众数集合的时候有一个技巧,因为题目中众数是可以有多个的,所以一般的方法需要遍历两遍才能求出众数的集合。

但可以遍历一遍就可以求众数集合,使用了适时清空结果集的方法,这个方法还是很巧妙的。相信仔细读了文章的同学会惊呼其巧妙!

501.二叉搜索树中的众数

题目链接:https://leetcode-cn.com/problems/find-mode-in-binary-search-tree/solution

给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。

假定 BST 有如下定义:

  • 结点左子树中所含结点的值小于等于当前结点的值
  • 结点右子树中所含结点的值大于等于当前结点的值
  • 左子树和右子树都是二叉搜索树

例如:

给定 BST [1,null,2,2],

返回[2].

提示:如果众数超过1个,不需考虑输出顺序

进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)

思路

这道题目呢,递归法我从两个维度来讲。

首先如果不是二叉搜索树的话,应该怎么解题,是二叉搜索树,又应该如何解题,两种方式做一个比较,可以加深大家对二叉树的理解。

递归法

如果不是二叉搜索树

如果不是二叉搜索树,最直观的方法一定是把这个树都遍历了,用map统计频率,把频率排个序,最后取前面高频的元素的集合。

具体步骤如下:

  1. 这个树都遍历了,用map统计频率

至于用前中后序那种遍历也不重要,因为就是要全遍历一遍,怎么个遍历法都行,层序遍历都没毛病!

这里采用前序遍历,代码如下:

//mapkey:元素,value:出现频率
voidsearchBST(TreeNode*cur,unordered_map<int,int>&map){//前序遍历
if(cur==NULL)return;
map[cur->val]++;//统计元素频率
searchBST(cur->left,map);
searchBST(cur->right,map);
return;
}
  1. 把统计的出来的出现频率(即map中的value)排个序

有的同学可能可以想直接对map中的value排序,还真做不到,C++中如果使用std::map或者std::multimap可以对key排序,但不能对value排序。

所以要把map转化数组即vector,再进行排序,当然vector里面放的也是pair类型的数据,第一个int为元素,第二个int为出现频率。

代码如下:

boolstaticcmp(constpair&a,constpair&b){
returna.second>b.second;//按照频率从大到小排序
}

vector>vec(map.begin(),map.end());
sort(vec.begin(),vec.end(),cmp);//给频率排个序
  1. 取前面高频的元素

此时数组vector中已经是存放着按照频率排好序的pair,那么把前面高频的元素取出来就可以了。

代码如下:

result.push_back(vec[0].first);
for(inti=1;i< vec.size(); i++) {
    //取最高的放到result数组中
if(vec[i].second==vec[0].second)result.push_back(vec[i].first);
elsebreak;
}
returnresult;

整体C++代码如下:

classSolution{
private:

voidsearchBST(TreeNode*cur,unordered_map<int,int>&map){//前序遍历
if(cur==NULL)return;
map[cur->val]++;//统计元素频率
searchBST(cur->left,map);
searchBST(cur->right,map);
return;
}
boolstaticcmp(constpair<int,int>&a,constpair<int,int>&b){
returna.second>b.second;
}
public:
vector<int>findMode(TreeNode*root){
unordered_map<int,int>map;//key:元素,value:出现频率
vector<int>result;
if(root==NULL)returnresult;
searchBST(root,map);
vectorint,int>>vec(map.begin(),map.end());
sort(vec.begin(),vec.end(),cmp);//给频率排个序
result.push_back(vec[0].first);
for(inti=1;i< vec.size(); i++) {
            //取最高的放到result数组中
if(vec[i].second==vec[0].second)result.push_back(vec[i].first);
elsebreak;
}
returnresult;
}
};

所以如果本题没有说是二叉搜索树的话,那么就按照上面的思路写!

是二叉搜索树

既然是搜索树,它中序遍历就是有序的

中序遍历代码如下:

voidsearchBST(TreeNode*cur){
if(cur==NULL)return;
searchBST(cur->left);//左
(处理节点)//中
searchBST(cur->right);//右
return;
}

遍历有序数组的元素出现频率,从头遍历,那么一定是相邻两个元素作比较,然后就把出现频率最高的元素输出就可以了。

关键是在有序数组上的话,好搞,在树上怎么搞呢?

这就考察对树的操作了。

二叉树:搜索树的最小绝对差中我们就使用了pre指针和cur指针的技巧,这次又用上了。

弄一个指针指向前一个节点,这样每次cur(当前节点)才能和pre(前一个节点)作比较。

而且初始化的时候pre = NULL,这样当pre为NULL时候,我们就知道这是比较的第一个元素。

代码如下:

if(pre==NULL){//第一个节点
count=1;//频率为1
}elseif(pre->val==cur->val){//与前一个节点数值相同
count++;
}else{//与前一个节点数值不同
count=1;
}
pre=cur;//更新上一个节点

此时又有问题了,因为要求最大频率的元素集合(注意是集合,不是一个元素,可以有多个众数),如果是数组上大家一般怎么办?

应该是先遍历一遍数组,找出最大频率(maxCount),然后再重新遍历一遍数组把出现频率为maxCount的元素放进集合。(因为众数有多个)

这种方式遍历了两遍数组。

那么我们遍历两遍二叉搜索树,把众数集合算出来也是可以的。

但这里其实只需要遍历一次就可以找到所有的众数。

那么如何只遍历一遍呢?

如果 频率count 等于 maxCount(最大频率),当然要把这个元素加入到结果集中(以下代码为result数组),代码如下:

if(count==maxCount){//如果和最大值相同,放进result中
result.push_back(cur->val);
}

是不是感觉这里有问题,result怎么能轻易就把元素放进去了呢,万一,这个maxCount此时还不是真正最大频率呢。

所以下面要做如下操作:

频率count 大于 maxCount的时候,不仅要更新maxCount,而且要清空结果集(以下代码为result数组),因为结果集之前的元素都失效了。

if(count>maxCount){//如果计数大于最大值
maxCount=count;//更新最大频率
result.clear();//很关键的一步,不要忘记清空result,之前result里的元素都失效了
result.push_back(cur->val);
}

关键代码都讲完了,完整代码如下:(只需要遍历一遍二叉搜索树,就求出了众数的集合

classSolution{
private:
intmaxCount;//最大频率
intcount;//统计频率
TreeNode*pre;
vector<int>result;
voidsearchBST(TreeNode*cur){
if(cur==NULL)return;

searchBST(cur->left);//左
//中
if(pre==NULL){//第一个节点
count=1;
}elseif(pre->val==cur->val){//与前一个节点数值相同
count++;
}else{//与前一个节点数值不同
count=1;
}
pre=cur;//更新上一个节点

if(count==maxCount){//如果和最大值相同,放进result中
result.push_back(cur->val);
}

if(count>maxCount){//如果计数大于最大值频率
maxCount=count;//更新最大频率
result.clear();//很关键的一步,不要忘记清空result,之前result里的元素都失效了
result.push_back(cur->val);
}

searchBST(cur->right);//右
return;
}

public:
vector<int>findMode(TreeNode*root){
count=0;
maxCount=0;
TreeNode*pre=NULL;//记录前一个节点
result.clear();

searchBST(root);
returnresult;
}
};

迭代法

只要把中序遍历转成迭代,中间节点的处理逻辑完全一样。

二叉树前中后序转迭代,传送门:

下面我给出其中的一种中序遍历的迭代法,其中间处理逻辑一点都没有变(我从递归法直接粘过来的代码,连注释都没改,哈哈)

代码如下:

classSolution{
public:
vector<int>findMode(TreeNode*root){
stackst;
TreeNode*cur=root;
TreeNode*pre=NULL;
intmaxCount=0;//最大频率
intcount=0;//统计频率
vector<int>result;
while(cur!=NULL||!st.empty()){
if(cur!=NULL){//指针来访问节点,访问到最底层
st.push(cur);//将访问的节点放进栈
cur=cur->left;//左
}else{
cur=st.top();
st.pop();//中
if(pre==NULL){//第一个节点
count=1;
}elseif(pre->val==cur->val){//与前一个节点数值相同
count++;
}else{//与前一个节点数值不同
count=1;
}
if(count==maxCount){//如果和最大值相同,放进result中
result.push_back(cur->val);
}

if(count>maxCount){//如果计数大于最大值频率
maxCount=count;//更新最大频率
result.clear();//很关键的一步,不要忘记清空result,之前result里的元素都失效了
result.push_back(cur->val);
}
pre=cur;
cur=cur->right;//右
}
}
returnresult;
}
};

总结

本题在递归法中,我给出了如果是普通二叉树,应该怎么求众数。

知道了普通二叉树的做法时候,我再进一步给出二叉搜索树又应该怎么求众数,这样鲜明的对比,相信会对二叉树又有更深层次的理解了。

在递归遍历二叉搜索树的过程中,我还介绍了一个统计最高出现频率元素集合的技巧, 要不然就要遍历两次二叉搜索树才能把这个最高出现频率元素的集合求出来。

为什么没有这个技巧一定要遍历两次呢?因为要求的是集合,会有多个众数,如果规定只有一个众数,那么就遍历一次稳稳的了。

最后我依然给出对应的迭代法,其实就是迭代法中序遍历的模板加上递归法中中间节点的处理逻辑,分分钟就可以写出来,中间逻辑的代码我都是从递归法中直接粘过来的。

求二叉搜索树中的众数其实是一道简单题,但大家可以发现我写了这么一大篇幅的文章来讲解,主要是为了尽量从各个角度对本题进剖析,帮助大家更快更深入理解二叉树

需要强调的是 leetcode上的耗时统计是非常不准确的,看个大概就行,一样的代码耗时可以差百分之50以上,所以leetcode的耗时统计别太当回事,知道理论上的效率优劣就行了。

其他语言版本

Java

暴力法

classSolution{
publicint[]findMode(FindModeInBinarySearchTree.TreeNoderoot){
Mapmap=newHashMap<>();
Listlist=newArrayList<>();
if(root==null)returnlist.stream().mapToInt(Integer::intValue).toArray();
//获得频率Map
searchBST(root,map);
List>mapList=map.entrySet().stream()
.sorted((c1,c2)->c2.getValue().compareTo(c1.getValue()))
.collect(Collectors.toList());
list.add(mapList.get(0).getKey());
//把频率最高的加入list
for(inti=1;i< mapList.size(); i++) {
   if(mapList.get(i).getValue()==mapList.get(i-1).getValue()){
list.add(mapList.get(i).getKey());
}else{
break;
}
}
returnlist.stream().mapToInt(Integer::intValue).toArray();
}

voidsearchBST(FindModeInBinarySearchTree.TreeNodecurr,Mapmap){
if(curr==null)return;
map.put(curr.val,map.getOrDefault(curr.val,0)+1);
searchBST(curr.left,map);
searchBST(curr.right,map);
}

}
classSolution{
ArrayListresList;
intmaxCount;
intcount;
TreeNodepre;

publicint[]findMode(TreeNoderoot){
resList=newArrayList<>();
maxCount=0;
count=0;
pre=null;
findMode1(root);
int[]res=newint[resList.size()];
for(inti=0;i< resList.size(); i++) {
            res[i] = resList.get(i);
        }
        returnres;
}

publicvoidfindMode1(TreeNoderoot){
if(root==null){
return;
}
findMode1(root.left);

introotValue=root.val;
//计数
if(pre==null||rootValue!=pre.val){
count=1;
}else{
count++;
}
//更新结果以及maxCount
if(count>maxCount){
resList.clear();
resList.add(rootValue);
maxCount=count;
}elseif(count==maxCount){
resList.add(rootValue);
}
pre=root;

findMode1(root.right);
}
}

Python

递归法

classSolution:
deffindMode(self,root:TreeNode)->List[int]:
ifnotroot:return
self.pre=root
self.count=0//统计频率
self.countMax=0//最大频率
self.res=[]
deffindNumber(root):
ifnotroot:returnNone//第一个节点
findNumber(root.left)//左
ifself.pre.val==root.val://中:与前一个节点数值相同
self.count+=1
else://与前一个节点数值不同
self.pre=root
self.count=1
ifself.count>self.countMax://如果计数大于最大值频率
self.countMax=self.count//更新最大频率
self.res=[root.val]//更新res
elifself.count==self.countMax://如果和最大值相同,放进res中
self.res.append(root.val)
findNumber(root.right)//右
return
findNumber(root)
returnself.res

迭代法-中序遍历-不使用额外空间,利用二叉搜索树特性

classSolution:
deffindMode(self,root:TreeNode)->List[int]:
stack=[]
cur=root
pre=None
maxCount,count=0,0
res=[]
whilecurorstack:
ifcur:#指针来访问节点,访问到最底层
stack.append(cur)
cur=cur.left
else:#逐一处理节点
cur=stack.pop()
ifpre==None:#第一个节点
count=1
elifpre.val==cur.val:#与前一个节点数值相同
count+=1
else:
count=1
ifcount==maxCount:
res.append(cur.val)
ifcount>maxCount:
maxCount=count
res.clear()
res.append(cur.val)

pre=cur
cur=cur.right
returnres


责任编辑:haq
  • SQL
    SQL
    +关注

    关注

    1

    文章

    375

    浏览量

    40864
  • 二叉树
    +关注

    关注

    0

    文章

    43

    浏览量

    11074
收藏 人收藏

    评论

    相关推荐

    pllua-ng为PostgreSQL数据库嵌入Lua

    ./oschina_soft/pllua-ng.zip
    发表于 06-24 10:59 38次 阅读
    pllua-ng为PostgreSQL数据库嵌入Lua

    SequoiaSQL分布式SQL存储引擎

    ./oschina_soft/sequoiasql-mysql.zip
    发表于 06-23 10:34 8次 阅读
    SequoiaSQL分布式SQL存储引擎

    Pg_Partman PostgreSQL的分区管理扩展插件

    ./oschina_soft/pg_partman.zip
    发表于 06-23 10:23 5次 阅读
    Pg_Partman PostgreSQL的分区管理扩展插件

    ZetaSQL SQL的分析框架

    ./oschina_soft/zetasql.zip
    发表于 06-22 10:27 3次 阅读
    ZetaSQL SQL的分析框架

    WalMiner PostgreSQL WAL日志解析工具

    ./oschina_soft/gitee-XLogMiner.zip
    发表于 06-21 14:20 7次 阅读
    WalMiner PostgreSQL WAL日志解析工具

    pg_lightool PostgresSQL数据坏块修复工具

    ./oschina_soft/gitee-pg_lightool.zip
    发表于 06-21 11:15 14次 阅读
    pg_lightool PostgresSQL数据坏块修复工具

    openLooKeng高性能数据虚拟化引擎

    ./oschina_soft/gitee-hetu-core.zip
    发表于 06-21 11:06 11次 阅读
    openLooKeng高性能数据虚拟化引擎

    MySQL用limit为什么会影响性能

    有一张财务流水表,未分库分表,目前的数据量为9555695,分页查询使用到了limit,优化之前的查....
    的头像 Linux爱好者 发表于 06-20 16:31 184次 阅读

    何时使用SQL,何时使用NoSQL

    一、何时使用 SQL? 在处理相关数据时,SQL 是一个不错的选择。关系数据库高效、灵活且易于被任何....
    的头像 深圳市恒讯科技有限公司 发表于 06-20 16:20 156次 阅读

    GreatSQL面向金融级应用的数据库

    ./oschina_soft/gitee-GreatSQL.zip
    发表于 06-17 15:00 14次 阅读
    GreatSQL面向金融级应用的数据库

    Apache AGE提供图数据库功能的PostgreSQL扩展

    ./oschina_soft/incubator-age.zip
    发表于 06-17 14:56 9次 阅读
    Apache AGE提供图数据库功能的PostgreSQL扩展

    pgmoneta PostgreSQL备份/恢复解决方案

    ./oschina_soft/pgmoneta.zip
    发表于 06-17 11:36 14次 阅读
    pgmoneta PostgreSQL备份/恢复解决方案

    QuestDB高性能时序数据库

    ./oschina_soft/questdb.zip
    发表于 06-17 11:04 8次 阅读
    QuestDB高性能时序数据库

    ZNbase NewSQL分布式数据库

    ./oschina_soft/gitee-zn-kvs.zip
    发表于 06-17 10:09 11次 阅读
    ZNbase NewSQL分布式数据库

    pglogical PostgreSQL扩展组件

    ./oschina_soft/pglogical.zip
    发表于 06-17 09:33 12次 阅读
    pglogical PostgreSQL扩展组件

    PL/R可加载过程语言

    ./oschina_soft/plr.zip
    发表于 06-17 09:20 18次 阅读
    PL/R可加载过程语言

    SQL:数据库的规范与介绍

    数据库的规范与介绍
    发表于 06-16 14:12 12次 阅读

    SQL/JAVA/mybatisplus数据脱敏实现原理

    MYSQL(电话号码,身份证)数据脱敏的实现
    的头像 Android编程精选 发表于 06-14 17:09 368次 阅读

    OPCUA转数据库-通过智能网关读取OPCUA标签,数据转存到数据库

            本文是通过智能网关模块连接OPCUA服务端,读取服务端的标签数值,将数据转存到MyS...
    发表于 06-14 14:42 1688次 阅读

    dbVisitor全功能数据库访问工具

    ./oschina_soft/gitee-dbvisitor.zip
    发表于 06-14 09:40 16次 阅读
    dbVisitor全功能数据库访问工具

    Mybatis-Plus Mybatis增强工具包

    ./oschina_soft/gitee-mybatis-plus.zip
    发表于 06-13 11:34 12次 阅读
    Mybatis-Plus Mybatis增强工具包

    HStreamDB EMQ流数据库

    ./oschina_soft/hstream.zip
    发表于 06-13 11:17 15次 阅读
    HStreamDB EMQ流数据库

    sqlstream将SQL复制事件流传输到Apache Kafka

    ./oschina_soft/sqlstream.zip
    发表于 06-13 09:30 11次 阅读
    sqlstream将SQL复制事件流传输到Apache Kafka

    TCODE论坛社区

    ./oschina_soft/gitee-tcode.zip
    发表于 06-10 10:16 16次 阅读
    TCODE论坛社区

    Icarus基于Python3.6和Vue.js的社区系统

    ./oschina_soft/Icarus.zip
    发表于 06-10 10:06 18次 阅读
    Icarus基于Python3.6和Vue.js的社区系统

    利用JAVA向Mysql插入一亿数量级数据—效率测评

    所以通过随机生成人的姓名、年龄、性别、电话、email、地址 ,向mysql数据库大量插入数据,便于....
    的头像 Android编程精选 发表于 05-24 11:13 1776次 阅读

    ObjectiveSQL IntelliJ IDEA Plugin是对ObjectiveSQL框架在IDEA开发必备工具

    ./oschina_soft/ob<x>jectiveSql-IntelliJ-Plugin.zip
    发表于 05-18 14:20 23次 阅读
    ObjectiveSQL IntelliJ IDEA Plugin是对ObjectiveSQL框架在IDEA开发必备工具

    SQL优化经历:从30248.271s到0.001s

    正常情况下是先join再进行where过滤,但是我们这里的情况,如果先join,将会有70w条数据发....
    的头像 数据分析与开发 发表于 05-16 15:25 366次 阅读

    Kubegres部署和维护PostgreSQL集群的Kubernetes Operator

    ./oschina_soft/kubegres.zip
    发表于 05-16 10:17 14次 阅读
    Kubegres部署和维护PostgreSQL集群的Kubernetes Operator

    Siddhi云原生流处理器

    ./oschina_soft/siddhi.zip
    发表于 05-16 10:10 40次 阅读
    Siddhi云原生流处理器

    SQL优化的一般步骤与案例分析

    在应用开发的早期,数据量少,开发人员开发功能时更重视功能上的实现,随着生产数据的增长,很多 SQL ....
    的头像 数据分析与开发 发表于 05-13 14:56 185次 阅读

    MatrixOne云端原生大数据引擎

    ./oschina_soft/matrixone.zip
    发表于 05-13 09:38 52次 阅读
    MatrixOne云端原生大数据引擎

    数据库单表行数最大多大?

    因为record们被分成好多份,放到好多页里了,为了唯一标识具体是哪一页,那就需要引入页号(其实是一....
    的头像 数据分析与开发 发表于 05-12 10:18 354次 阅读

    Whitewidow SQL漏洞自动扫描工具

    ./oschina_soft/whitewidow.zip
    发表于 05-09 10:48 29次 阅读
    Whitewidow SQL漏洞自动扫描工具

    for循环耗时太长,请大佬帮忙

    两个数据库A、B都有产品序列号关联起来,我想检索并显示数据库A中有记录,而在数据库B中没有记录的信息。目前的程序也可以...
    发表于 04-29 16:21 11508次 阅读

    二叉树的最小深度

    遍历顺序上依然是后序遍历(因为要比较递归返回之后的结果),但在处理中间节点的逻辑上,最大深度很容易理....
    的头像 算法与数据结构 发表于 04-28 16:27 464次 阅读

    pgFouine PostgreSQL日志分析

    pgfouine.zip
    发表于 04-28 10:26 38次 阅读
    pgFouine PostgreSQL日志分析

    Postgres Operator在K8s上构建高可用PostgreSQL集群

    postgres-operator.zip
    发表于 04-28 09:58 44次 阅读
    Postgres Operator在K8s上构建高可用PostgreSQL集群

    pgBadger PostgreSQL日志分析程序

    pgbadger.zip
    发表于 04-27 09:08 35次 阅读
    pgBadger PostgreSQL日志分析程序

    MyEye企业内部健康实时监控系统

    gitee-MyEye.zip
    发表于 04-26 10:08 53次 阅读
    MyEye企业内部健康实时监控系统

    C语言数据结构:什么是二叉树?

    完全二叉树:完全二叉树是效率很高的数据结构。对于深度为K,有n个节点的二叉树,当且仅当每一个节点都与....
    的头像 C语言编程学习基地 发表于 04-21 16:20 460次 阅读

    数据库语言的目标,SQL为什么不行

    数据库这个软件,名字中有个“库”字,会让人觉得它主要是为了存储的。其实不然,数据库实现的重要功能有两....
    的头像 程序员cxuan 发表于 04-14 09:27 257次 阅读

    RushOrm将java类映射到SQL表来取代对SQL的需求

    RushOrm 通过将 java 类映射到 SQL 表来取代对 SQL 的需求。 为什么要编写 Ru....
    发表于 04-13 09:59 38次 阅读

    PG12/GP7操作符+的实现

    SeqScanState为顺序扫描的节点状态结构,内有成员StateState ss:扫描状态信息,....
    的头像 十亿少男的梦 发表于 04-07 15:18 208次 阅读
    PG12/GP7操作符+的实现

    如何优化MySQL百万数据的深分页问题

    我们日常做分页需求时,一般会用limit实现,但是当偏移量特别大的时候,查询效率就变得低下。本文将分....
    的头像 数据分析与开发 发表于 04-06 15:12 311次 阅读

    ostgreSQL中的查询:查询执行阶段

     词法分析器和解析器。词法解析器负责识别查询字符串中的词位(如SQL关键字、字符串、数字文字等),而....
    的头像 li5236 发表于 03-29 14:31 531次 阅读
    ostgreSQL中的查询:查询执行阶段

    如何使用 go 实现红黑树

    二叉查找树也叫二叉搜索树,也叫二叉排序树,它具有以下特点:1. 如果左子树不为空,则左子树上的结点的....
    的头像 Linux爱好者 发表于 03-21 11:54 388次 阅读

    sql优化,一定要用好Explain

    explain 为 select语句中使用的每个表返回一行信息。它按 mysql 在处理语句时读取的....
    的头像 Android编程精选 发表于 03-18 09:50 309次 阅读

    数据泄露的最常见原因 企业如何预防数据泄露

    什么是数据泄露? 数据泄露(data leakage),有时也叫做泄露、穿越等。它说的是用于训练机器....
    的头像 Les 发表于 01-30 17:34 829次 阅读

    Namisoft针对开关电源PCB 电磁兼容性的建模分析

    开关电源的共模干扰和差模干扰对电路的影响是不同的,通常低频时差模噪声占主导地位,高频时共模噪声占主导....
    发表于 01-10 10:29 80次 阅读
    Namisoft针对开关电源PCB 电磁兼容性的建模分析

    嵌入式SQL语句与主语言之间的通信

    嵌入式SQL                        嵌入...
    发表于 12-22 07:44 1132次 阅读

    SQL编程技术的特点有哪些

    SQL编程技术可以有效的克服SQL语言实现复杂应用方面的不足,提高应用系统和数据管理系统间的互操作性。SQL的特点之一是...
    发表于 12-22 07:04 1002次 阅读

    求一种突破sql功能局限的方案

    sql功能虽然强大,但是还是有很多的要求无法达到例如:突破sql局限的方案:1、利用高级语言的表达能力:嵌入式sql2、扩展sql语言...
    发表于 12-22 06:13 1001次 阅读

    嵌入式SQL语言概述

    嵌入式SQL概述嵌入式SQL语言将SQL语言嵌入到某一种高级语言中使用这种高级语言,如C/C++, Java, PowerBuilder等,...
    发表于 12-21 06:55 800次 阅读

    如何去使用嵌入式SQL呢

    文章目录 第十二章 使用嵌入式SQL(四)SQL游标`DECLARE`游标声明OPEN游标声明`FETCH`游标声明CLOSE...
    发表于 12-15 09:01 259次 阅读

    嵌入式SQL程序是由什么组成的

    概念一个嵌入式SQL程序由一种普通编程语言编写的代码(这里是C)和位于特殊标记小节中的SQL命令混合组成。要构建该程序,...
    发表于 12-15 07:26 604次 阅读

    C语言中使用嵌入式SQL访问Oracle数据库的方法

    使用C语言开发Oracle应用程序通常有两种方法。一是利用嵌入式SQL语言,将SQL作为子语言嵌入到C语言中,借助C语言访问O...
    发表于 12-15 06:35 556次 阅读

    报表打开慢跟踪难?可通过性能监控快速解决

    在BI系统中,经常会遇到性能的问题,比如打开报表慢,可能是数据量太大,或是报表前端太大加载慢;或是网....
    发表于 12-09 15:00 165次 阅读
    报表打开慢跟踪难?可通过性能监控快速解决

    MyBatis批量插入数据的3种方法你知道几种

    批量插入功能是我们日常工作中比较常见的业务功能之一, 今天 来一个 MyBatis 批量插入的汇总篇....
    的头像 数据分析与开发 发表于 12-08 17:56 1340次 阅读
    MyBatis批量插入数据的3种方法你知道几种

    使用SQL语句操作数据库

    第一步:Linux开发环境搭建第二步:安装sqlite数据库第三步:sqlite数据库使用1.sqlite部分命令2.使用SQL语句操作数据库(1)...
    发表于 11-04 06:23 571次 阅读