﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Just enjoy programming-随笔分类-算法</title><link>http://www.cppblog.com/tankzhouqiang/category/16140.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 21 May 2011 00:38:00 GMT</lastBuildDate><pubDate>Sat, 21 May 2011 00:38:00 GMT</pubDate><ttl>60</ttl><item><title>最短路径</title><link>http://www.cppblog.com/tankzhouqiang/archive/2011/05/19/146758.html</link><dc:creator>周强</dc:creator><author>周强</author><pubDate>Thu, 19 May 2011 08:44:00 GMT</pubDate><guid>http://www.cppblog.com/tankzhouqiang/archive/2011/05/19/146758.html</guid><wfw:comment>http://www.cppblog.com/tankzhouqiang/comments/146758.html</wfw:comment><comments>http://www.cppblog.com/tankzhouqiang/archive/2011/05/19/146758.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tankzhouqiang/comments/commentRss/146758.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tankzhouqiang/services/trackbacks/146758.html</trackback:ping><description><![CDATA[（一）迪杰斯特拉算法（时间复杂度O(n2)）<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 迪杰斯特拉（Dijkstra）算法是求某个源点到其余各顶点的最短路径，这是一个按路径长度递增的次序产生最短路径的算法。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先引进一个辅助向量D,它的每个分量D[i]表示当前所找到的从始点v到每个终点vi的最短路径的长度。它的初态为：若从v到vi有弧，则D[i]为弧上的权值；否则置D[i]为无穷大。显然，长度为D[j]=Min{D[i]|vi属于V}的路径就是从v出发的长度最短的一条最短路径。因此，在一般情况下，下一条长度次短的最短路径的长度必为D[j]=Min{D[i]|vi 属于 V-S} 其中D[i]或者为弧（v,vi)上的权值，或者是D[k](vk属于S)和弧（vk,vi）上的权值之和。算法步骤如下：<br />(1)假设用带权的邻接矩阵arcs来表示带权有向图，arcs[i][j]表示弧(vi,vj)上的权值。若(vi,vj)不存在，则置arcs[i][j]为无穷大。S为已找到从v出发的最短路径的终点的集合，它的初始状态为空集。那么，从v出发到图上其余各顶点（终点）vi,可能达到的最短路径长度的初值为：<br />D[i]=G.arcs[v][vi],vi属于V<br />(2)选择Vj，使得<br />&nbsp;&nbsp; D[j]=Min{D[i]|vi 属于V-S}<br />vj 就是当前求得的一条从v出发的最短路径的终点。令<br />&nbsp;&nbsp; S=SＵ　｛ｊ｝<br />(3)&nbsp;&nbsp; 修改从v出发到集合V-S上任一顶点vk可达的最短路径长度。如果D[j]+arcs[j][k]&lt;D[k]则修改D[k]为 D[k]=D[j]+arcs[j][k]<br />(4) 重复操作(2),(3)共 n-1次。由此求得从v到图上其余各顶点的最短路径是依路径长度递增的序列。<br /><br />（二）弗洛伊德(Floyd)算法（时间复杂度为O(n3)）<br />弗洛伊德（Floyd）算法是求图中每一对顶点之间的最短路径，时间复杂度为O(n3).<br />弗洛伊德算法仍从图的带权邻接矩阵cost出发，其基本思想是 :<br />假设求从顶点vi到vj的最短路径。如果从vi到vj有弧，则从vi到vj存在一条长度arcs[i][j]的路径，该路径不一定是最短路径，尚需进行n次试探。首先考虑路径(vi,v0,vj)是否存在（即判别弧（vi,v0）和(v0,vj)是否存在)。 如果存在，则比较(vi,vj)和(vi,v0,vj)是否存在(即判别弧(vi,v0)和(v0,vj)是否存在).如果存在，则比较(vi,vj)和(vi,v0,vj)的路径长度取长度较短者为从vi到vj的中间顶点的序号不大于0的最短路径。假如在路径上再增加一个顶点v1,也就是说，如果(vi,...v1)和(v1...vj)分别为当前找到的中间顶点的序号不大于0的最短路径，那么（vi,...,v1,...vj）就有可能是从vi到vj的中间顶点的序号不大于1的最短路径。将它和已经得到的从vi到vj中间的顶点序号不大于0的最短路径相比较，从中选出中间顶点的序号不大于1的最短路径之后，再增加一个顶点v2,继续进行试探。依次类推。在一般情况下，若(vi,...,vk)和(vk,...vj)分别是从vi到vk和从vk到vj的中间顶点的序号不大于k-1的最短路径，则将(vi,...vk,...vj)和已经得到的从vi到vj且中间顶点序号不大于k-1的最短路径相比较，其长度较短者便是从vi到vj的中间顶点的序号不大于k的最短路径。这样，在经过n次比较后，最后求得的必是从vi到vj的最短路径。<br />现定义一个n阶方阵序列<br />D(-1),D(0),D(1),...D(k),...D(n-1)<br />其中<br />D(-1)[i][j]=G.arcs[i][j].<br />D(k)[i][j]=Min{D(k-1)[i][j],D(k-1)[i][k]+D(k-1)[k][j]}&nbsp; 0&lt;=k&lt;=n-1<br />从上述计算公式可见，D(1)[i][j]是从vi到vj的中间顶点的序号不大于1的最短路径的长度。D(k)[i][j]是从vi到vj的中间顶点的序号不大于k的最短路径的长度。D(n-1)[i][j]就是从vi到vj的最短路径的长度。<br /><img src ="http://www.cppblog.com/tankzhouqiang/aggbug/146758.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tankzhouqiang/" target="_blank">周强</a> 2011-05-19 16:44 <a href="http://www.cppblog.com/tankzhouqiang/archive/2011/05/19/146758.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最小生成树</title><link>http://www.cppblog.com/tankzhouqiang/archive/2011/05/19/146737.html</link><dc:creator>周强</dc:creator><author>周强</author><pubDate>Thu, 19 May 2011 03:09:00 GMT</pubDate><guid>http://www.cppblog.com/tankzhouqiang/archive/2011/05/19/146737.html</guid><wfw:comment>http://www.cppblog.com/tankzhouqiang/comments/146737.html</wfw:comment><comments>http://www.cppblog.com/tankzhouqiang/archive/2011/05/19/146737.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tankzhouqiang/comments/commentRss/146737.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tankzhouqiang/services/trackbacks/146737.html</trackback:ping><description><![CDATA[安全边：在每一次迭代之前， A是某个最小生成树的一个子集。在算法的每一步中，确定一条边（u,v),使得将它加入集合A后，仍然不违反这个循环不等式，A U {(u,v)}仍然是某一个最小生成树的子集。称这样的边为A的安全边。<br /><br />识别安全边的定理：设图G=(V,E)是一个无向连通图，并且在E上定义了一个具有实数值的加权函数w.设A是E的一个子集，它包含于G的某个最小生成树中。设割(S,V-S)是G的任意一个不妨害A的割，且边(u,v)是通过割(S,V-S)的一条轻边，则边(u,v)对集合A来说是安全的。<br /><br /><br />推论：设G=(V,E)是一个无向联通图，并且在E上定义了相应的实数值加权函数w.设A是E的子集，并包含于G的某一最小生成树中。设C=(Vc,Ec)为森林GA=(V,A) 的一个连通分支。如果边是连接C和Ga中其他某联通分支的一条轻边，则(u,v)对集合A来说是安全.<br /><br />在Kruskal(<em>克鲁斯卡尔)</em>算法和Prim(普里姆)算法<br />在Kruskal算法中，集合A是一个森林，加入集合A中的安全边总是图中连接两个不同联通分支的最小权边。在Prim算法中，集合A仅形成单棵树，添加入集合A的安全边总是连接树与一个不在树中的顶点的最小权边。<br /><br />Kruskal(<em>克鲁</em>斯卡尔)算法(O(ElgE))：<br />该算法找出森林中连接任意两棵树的所有边中，具有最小权值的边(u,v)作为安全边，并把它添加到正在生长的森林中。设C1和C2表示边(u,v)连接的两棵树，因为(u,v)必是连接C1和其他某棵树的一条轻边，所以由上面推论可知，(u,v)对C1来说是安全边。Kruskal 算法同时也是一种贪心算法， 因为在算法的每一步中，添加到森林中的边的权值都是尽可能小的。<br />下面是伪代码:<br />MST-KRUSKAL(G,w)<br />A&lt;--空集<br />for each vertex v 属于 V[G]<br />&nbsp;&nbsp; &nbsp;&nbsp; do MAKE-SET(v)<br />sort the edges of E into nondecreasing order by weight w<br />for each edge(u,v)属于E,taken in nondecreasing order by weight<br />&nbsp;&nbsp; do if FIND-SET(u)!=FIND-SET(v)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; then&nbsp; A&lt;--AU{(u,v)}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UNION(u,v)<br />return A<br /><br />FIND-SET(u)返回包含u的集合中的一个代表元素。于是通过测试FIND-SET(u)是否等同于FIND-SET(v)，就可以确定顶点u和v是否属于同一棵树。通过过程UNION，可以实现树与树的合并。<br /><br /><br />Prim算法(O(ElgV))<br />&nbsp;&nbsp;&nbsp; Prim算法的特点是集合A中的边总是形成单棵树。树从任意根顶点r开始形成，并逐渐生成，直至该树覆盖了V中的所有顶点。在每一步，一条连接了树A与Ga=(V,A)中某孤立顶点的轻边被加入树A中。由推论可知，该规则仅加入对A安全的边，因此当算法终止时，A中的边形成了一棵最小生成树。因此每次添加到树中的边都是使树的权尽可能小的边，因此，上述策略也是&#8220;贪心&#8220;的。<br /><br />伪代码如下：<br />MST-PRIM(G,w,r)<br /><br />for each u 属于V[G]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do key[u]&nbsp; &lt;--空集<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n[u]&lt;--NIL<br /><br />key[r]&lt;--0<br />Q&lt;--V[G]<br />while&nbsp; Q!=空集<br />&nbsp;&nbsp;&nbsp; do u&lt;---EXTRACT-MIN(Q)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for each v属于Adj[u]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do if v 属于Q&nbsp; and w(u,v)&lt;key[v]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; then n[u]&lt;---u<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key[v]&lt;--w(u,v)<br /><br /><br />参考：算法导论<img src ="http://www.cppblog.com/tankzhouqiang/aggbug/146737.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tankzhouqiang/" target="_blank">周强</a> 2011-05-19 11:09 <a href="http://www.cppblog.com/tankzhouqiang/archive/2011/05/19/146737.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AVL树（转载）</title><link>http://www.cppblog.com/tankzhouqiang/archive/2011/05/11/146168.html</link><dc:creator>周强</dc:creator><author>周强</author><pubDate>Wed, 11 May 2011 02:25:00 GMT</pubDate><guid>http://www.cppblog.com/tankzhouqiang/archive/2011/05/11/146168.html</guid><wfw:comment>http://www.cppblog.com/tankzhouqiang/comments/146168.html</wfw:comment><comments>http://www.cppblog.com/tankzhouqiang/archive/2011/05/11/146168.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tankzhouqiang/comments/commentRss/146168.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tankzhouqiang/services/trackbacks/146168.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;">转载：http://www.cppblog.com/converse/archive/2007/08/29/31179.html<br><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #000000;">/********************************************************************</span><span style="color: #000000;"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">created:&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">2007</span><span style="color: #000000;">/</span><span style="color: #000000;">08</span><span style="color: #000000;">/</span><span style="color: #000000;">28</span><span style="color: #000000;"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">filename:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avltree.c<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">author:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Lichuang<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">purpose:&nbsp;&nbsp;&nbsp;&nbsp;AVL树的实现代码,&nbsp;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;参考资料</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">数据结构与算法分析</span><span style="color: #000000;">-</span><span style="color: #000000;">C语言描述</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">,&nbsp;作者Allen&nbsp;Weiss<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #000000;">*********************************************************************/</span><span style="color: #000000;"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdlib.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">time</span><span style="color: #000000;">.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">typedef&nbsp;struct&nbsp;AVLTree<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">{<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nData;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;AVLTree</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pLeft;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;AVLTree</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pRight;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nHeight;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">}AVLTree;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;Max(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;a,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;b);<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;Height(AVLTree</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pNode);<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">AVLTree</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;Insert(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nData,&nbsp;AVLTree</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pNode);<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">AVLTree</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;SingleRotateWithLeft(AVLTree</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pNode);<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">AVLTree</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;SingleRotateWithRight(AVLTree</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pNode);<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">AVLTree</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;DoubleRotateWithLeft(AVLTree</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pNode);<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">AVLTree</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;DoubleRotateWithRight(AVLTree</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pNode);<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">void&nbsp;DeleteTree(AVLTree</span><span style="color: #000000;">**</span><span style="color: #000000;">&nbsp;ppRoot);<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">void&nbsp;PrintTree(AVLTree</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pRoot);<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">{<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;AVLTree</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pRoot&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;srand((unsigned&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)::</span><span style="color: #0000ff;">time</span><span style="color: #000000;">(</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">));<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">100000000</span><span style="color: #000000;">;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">i)<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;{<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pRoot&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Insert(::rand(),&nbsp;pRoot);<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">//</span><span style="color: #000000;">PrintTree(pRoot);<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;DeleteTree(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">pRoot);<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">}<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;Max(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;a,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;b)<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">{<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(a&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;b&nbsp;?&nbsp;a&nbsp;:&nbsp;b);<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">}<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;Height(AVLTree</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pNode)<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">{<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;pNode)<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">nHeight;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">}<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">AVLTree</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;Insert(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nData,&nbsp;AVLTree</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pNode)<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">{<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;pNode)<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;{<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pNode&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(AVLTree</span><span style="color: #000000;">*</span><span style="color: #000000;">)malloc(sizeof(AVLTree));<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">nData&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;nData;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">nHeight&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pLeft&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pRight&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(nData&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">nData)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">//</span><span style="color: #000000;">&nbsp;插入到左子树中<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;{<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pLeft&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Insert(nData,&nbsp;pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pLeft);<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(Height(pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pLeft)&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;Height(pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pRight)&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">)&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">//</span><span style="color: #000000;">&nbsp;AVL树不平衡<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(nData&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pLeft</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">nData)<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">//</span><span style="color: #000000;">&nbsp;插入到了左子树左边,&nbsp;做单旋转<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pNode&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;SingleRotateWithLeft(pNode);<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">//</span><span style="color: #000000;">&nbsp;插入到了左子树右边,&nbsp;做双旋转<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pNode&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;DoubleRotateWithLeft(pNode);<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(nData&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">nData)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">//</span><span style="color: #000000;">&nbsp;插入到右子树中<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;{<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pRight&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Insert(nData,&nbsp;pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pRight);<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(Height(pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pRight)&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;Height(pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pLeft)&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">)&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">//</span><span style="color: #000000;">&nbsp;AVL树不平衡<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(nData&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pRight</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">nData)<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">//</span><span style="color: #000000;">&nbsp;插入到了右子树右边,&nbsp;做单旋转<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pNode&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;SingleRotateWithRight(pNode);<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">//</span><span style="color: #000000;">&nbsp;插入到了右子树左边,&nbsp;做双旋转<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pNode&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;DoubleRotateWithRight(pNode);<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">nHeight&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Max(Height(pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pLeft),&nbsp;Height(pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pRight))&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;pNode;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">}<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #000000;">/********************************************************************</span><span style="color: #000000;"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pNode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pLeft&nbsp;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">\</span><span style="color: #000000;"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pLeft&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">==&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pNode<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">\</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pLeft</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pRight&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pLeft</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pRight<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #000000;">*********************************************************************/</span><span style="color: #000000;"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">AVLTree</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;SingleRotateWithLeft(AVLTree</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pNode)<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">{<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;AVLTree</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pNode1;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;pNode1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pLeft;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pLeft&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pNode1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pRight;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;pNode1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pRight&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pNode;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">//</span><span style="color: #000000;">&nbsp;结点的位置变了,&nbsp;要更新结点的高度值<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">nHeight&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Max(Height(pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pLeft),&nbsp;Height(pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pRight))&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;pNode1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">nHeight&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Max(Height(pNode1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pLeft),&nbsp;pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">nHeight)&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;pNode1;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">}<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #000000;">/********************************************************************</span><span style="color: #000000;"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">pNode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pRight<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">\</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pRight&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">==&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;pNode&nbsp;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">\</span><span style="color: #000000;"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pRight</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pLeft&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pRight</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pLeft<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #000000;">*********************************************************************/</span><span style="color: #000000;"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">AVLTree</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;SingleRotateWithRight(AVLTree</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pNode)<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">{<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;AVLTree</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pNode1;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;pNode1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pRight;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pRight&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pNode1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pLeft;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;pNode1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pLeft&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pNode;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">//</span><span style="color: #000000;">&nbsp;结点的位置变了,&nbsp;要更新结点的高度值<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">nHeight&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Max(Height(pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pLeft),&nbsp;Height(pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pRight))&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;pNode1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">nHeight&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Max(Height(pNode1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pRight),&nbsp;pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">nHeight)&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;pNode1;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">}<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">AVLTree</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;DoubleRotateWithLeft(AVLTree</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pNode)<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">{<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pLeft&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;SingleRotateWithRight(pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pLeft);<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;SingleRotateWithLeft(pNode);<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">}<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">AVLTree</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;DoubleRotateWithRight(AVLTree</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pNode)<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">{<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pRight&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;SingleRotateWithLeft(pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pRight);<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;SingleRotateWithRight(pNode);<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">}<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #000000;">//</span><span style="color: #000000;">&nbsp;后序遍历树以删除树<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">void&nbsp;DeleteTree(AVLTree</span><span style="color: #000000;">**</span><span style="color: #000000;">&nbsp;ppRoot)<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">{<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;ppRoot&nbsp;||&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">ppRoot)<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;DeleteTree(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">((</span><span style="color: #000000;">*</span><span style="color: #000000;">ppRoot)</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pLeft));<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;DeleteTree(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">((</span><span style="color: #000000;">*</span><span style="color: #000000;">ppRoot)</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pRight));<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;free(</span><span style="color: #000000;">*</span><span style="color: #000000;">ppRoot);<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">ppRoot&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">}<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #000000;">//</span><span style="color: #000000;">&nbsp;中序遍历打印树的所有结点,&nbsp;因为左结点&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;父结点&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;右结点,&nbsp;因此打印出来数据的大小是递增的<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">void&nbsp;PrintTree(AVLTree</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pRoot)<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">{<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;pRoot)<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;PrintTree(pRoot</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pLeft);<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">[%d]nData&nbsp;=&nbsp;%d\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">n,&nbsp;pRoot</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">nData);<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;PrintTree(pRoot</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pRight);<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">}<br><img  src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span></div><img src ="http://www.cppblog.com/tankzhouqiang/aggbug/146168.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tankzhouqiang/" target="_blank">周强</a> 2011-05-11 10:25 <a href="http://www.cppblog.com/tankzhouqiang/archive/2011/05/11/146168.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>动态规划（三）</title><link>http://www.cppblog.com/tankzhouqiang/archive/2011/04/04/143395.html</link><dc:creator>周强</dc:creator><author>周强</author><pubDate>Mon, 04 Apr 2011 05:45:00 GMT</pubDate><guid>http://www.cppblog.com/tankzhouqiang/archive/2011/04/04/143395.html</guid><wfw:comment>http://www.cppblog.com/tankzhouqiang/comments/143395.html</wfw:comment><comments>http://www.cppblog.com/tankzhouqiang/archive/2011/04/04/143395.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tankzhouqiang/comments/commentRss/143395.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tankzhouqiang/services/trackbacks/143395.html</trackback:ping><description><![CDATA[最长公共子序列实现<br><br>参考算法导论第208页<br><br>#include&lt;stdio.h&gt;<br>#include&lt;stdlib.h&gt;<br>#include&lt;string.h&gt;<br><br><br>void LCS(char *p,char *q)<br>{<br>&nbsp;&nbsp; &nbsp;int lenP,lenQ;<br>&nbsp;&nbsp; &nbsp;int *s,*t;<br>&nbsp;&nbsp; &nbsp;lenP=strlen(p);<br>&nbsp;&nbsp; &nbsp;lenQ=strlen(q);<br>&nbsp;&nbsp; &nbsp;int i,j;<br><br>&nbsp;&nbsp; &nbsp;if((s=(int*)malloc(sizeof(int)*(lenP+1)*(lenQ+1)))==NULL)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;perror("malloc error");<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;exit(1);<br>&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;if((t=(int*)malloc(sizeof(int)*(lenP+1)*(lenQ+1)))==NULL)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;perror("malloc error");<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;exit(1);<br>&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;for(i=0;i&lt;(lenP+1);i++)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;s[i]=0;<br>&nbsp;&nbsp; &nbsp;for(i=0;i&lt;(lenQ+1);i++)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;s[i*(lenP+1)]=0;<br><br>&nbsp;&nbsp; &nbsp;for(i=1;i&lt;(lenQ+1);i++)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for(j=1;j&lt;(lenP+1);j++)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if(q[i-1]==p[j-1])<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;s[i*(lenP+1)+j]=s[(i-1)*(lenP+1)+j-1]+1;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;t[i*(lenP+1)+j]=3;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}else if(s[(i-1)*(lenP+1)+j]&lt;s[i*(lenP+1)+j-1]){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;s[i*(lenP+1)+j]=s[i*(lenP+1)+j-1];<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;t[i*(lenP+1)+j]=1;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}else{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;s[i*(lenP+1)+j]=s[(i-1)*(lenP+1)+j];<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;t[i*(lenP+1)+j]=2;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;/*输出矩阵结果*/<br>&nbsp;&nbsp; &nbsp;printf("output the result:\n");<br>&nbsp;&nbsp; &nbsp;for(i=0;i&lt;(lenQ+1);i++)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for(j=0;j&lt;(lenP+1);j++)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("%d&nbsp; ",s[i*(lenP+1)+j]);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("\n");<br>&nbsp;&nbsp; &nbsp;}<br><br><br>&nbsp;&nbsp; &nbsp;printf("output the result 箭头 1表示向左，2表示向上，3表示斜向上:\n");<br>&nbsp;&nbsp; &nbsp;for(i=0;i&lt;(lenQ+1);i++)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for(j=0;j&lt;(lenP+1);j++)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("%d&nbsp; ",t[i*(lenP+1)+j]);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("\n");<br>&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;i=lenQ;<br>&nbsp;&nbsp; &nbsp;j=lenP;<br>&nbsp;&nbsp; &nbsp;/*倒序输出LCS*/<br>&nbsp;&nbsp; &nbsp;printf("倒序输出LCS\n");<br>&nbsp;&nbsp; &nbsp;while(i&gt;1 || j&gt;1)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if(t[i*(lenP+1)+j]==3)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("%c&nbsp; ",p[j-1]);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;i--;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;j--;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}else if(t[i*(lenP+1)+j]==2)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;i--;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}else<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;j--;<br>&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;printf("\n");<br>}<br><br>int main()<br>{<br>&nbsp;&nbsp; &nbsp;char *p="BDCABA";<br>&nbsp;&nbsp; &nbsp;char *q="ABCBDAB";<br>&nbsp;&nbsp; &nbsp;LCS(p,q);<br>}
<br><br><img src ="http://www.cppblog.com/tankzhouqiang/aggbug/143395.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tankzhouqiang/" target="_blank">周强</a> 2011-04-04 13:45 <a href="http://www.cppblog.com/tankzhouqiang/archive/2011/04/04/143395.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>动态规划(二)</title><link>http://www.cppblog.com/tankzhouqiang/archive/2011/04/03/143365.html</link><dc:creator>周强</dc:creator><author>周强</author><pubDate>Sun, 03 Apr 2011 13:28:00 GMT</pubDate><guid>http://www.cppblog.com/tankzhouqiang/archive/2011/04/03/143365.html</guid><wfw:comment>http://www.cppblog.com/tankzhouqiang/comments/143365.html</wfw:comment><comments>http://www.cppblog.com/tankzhouqiang/archive/2011/04/03/143365.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tankzhouqiang/comments/commentRss/143365.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tankzhouqiang/services/trackbacks/143365.html</trackback:ping><description><![CDATA[矩阵链乘法实现（算法导论&nbsp; P197）<br>#include&lt;stdio.h&gt;<br>#include&lt;stdlib.h&gt;<br><br>#define MAX 65536<br><br>void printMatrix(int *s,int len,int i,int j)<br>{<br>&nbsp;&nbsp; &nbsp;if(i==j)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("A%d",i+1);<br>&nbsp;&nbsp; &nbsp;else{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("(");<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printMatrix(s,len,i,s[i*len+j]);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printMatrix(s,len,s[i*len+j]+1,j);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf(")");<br>&nbsp;&nbsp; &nbsp;}<br><br>}<br><br>void matrixOrder(int p[][2],int len)<br>{<br>&nbsp;&nbsp; &nbsp;int *m,*s;<br>&nbsp;&nbsp; &nbsp;int i,j,k;<br>&nbsp;&nbsp; &nbsp;if((m=malloc(len*len*sizeof(int)))==NULL)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;perror("malloc error");<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;exit(1);<br>&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;if((s=malloc(len*len*sizeof(int)))==NULL)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;perror("malloc error");<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;exit(1);<br>&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;for(i=0;i&lt;len;i++)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;m[i*len+i]=0;<br><br>&nbsp;&nbsp; &nbsp;for(i=1;i&lt;len;i++)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for(j=0;j+i&lt;len;j++)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;m[j*len+j+i]=MAX;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for(k=j;k&lt;j+i;k++)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if((p[j][0]*p[k][1]*p[i+j][1]+m[j*len+k]+m[(k+1)*len+i+j])&lt;m[j*len+j+i])<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;m[j*len+j+i]=p[j][0]*p[k][1]*p[i+j][1]+m[j*len+k]+m[(k+1)*len+i+j];<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;s[j*len+j+i]=k;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;printf("##### then matrix m\n");<br>&nbsp;&nbsp; &nbsp;for(i=0;i&lt;len;i++)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for(j=0;j&lt;len;j++)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("%d&nbsp; ",m[i*len+j]);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("\n");<br>&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;printf("##### the matrix s\n");&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;for(i=0;i&lt;len;i++)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for(j=0;j&lt;len;j++)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("%d&nbsp; ",s[i*len+j]);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("\n");<br>&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp;&nbsp; printMatrix(s,len,0,5);<br>&nbsp;&nbsp;&nbsp; printf("\n");<br>}<br><br><br>int main()<br>{<br>&nbsp;&nbsp;&nbsp; int p[6][2]={{30,35},{35,15},{15,5},{5,10},{10,20},{20,25}};<br>&nbsp;&nbsp;&nbsp; matrixOrder(p,6);<br>} <br><br><br><img src ="http://www.cppblog.com/tankzhouqiang/aggbug/143365.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tankzhouqiang/" target="_blank">周强</a> 2011-04-03 21:28 <a href="http://www.cppblog.com/tankzhouqiang/archive/2011/04/03/143365.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>动态规划（一）</title><link>http://www.cppblog.com/tankzhouqiang/archive/2011/04/03/143364.html</link><dc:creator>周强</dc:creator><author>周强</author><pubDate>Sun, 03 Apr 2011 13:26:00 GMT</pubDate><guid>http://www.cppblog.com/tankzhouqiang/archive/2011/04/03/143364.html</guid><wfw:comment>http://www.cppblog.com/tankzhouqiang/comments/143364.html</wfw:comment><comments>http://www.cppblog.com/tankzhouqiang/archive/2011/04/03/143364.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tankzhouqiang/comments/commentRss/143364.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tankzhouqiang/services/trackbacks/143364.html</trackback:ping><description><![CDATA[动态规划是通过组合子问题的解而解决整个问题。<br>动态规划算法设计可以分为4个步骤<br>（1）描述最优解的结构<br>（2）递归定义最优解的值<br>（3）按自底向上的方式计算最优解的值<br>（4）由计算出的结果构造一个最优解<br><br>装配线调度实现(算法导论192页)<br><br>参考算法导论 第15章<br><br>#include&lt;stdio.h&gt;<br>#include&lt;stdlib.h&gt;<br><br><br>int schedule(int a[][6],int t[][5],int e[],int x[])<br>{<br><br>&nbsp;&nbsp; &nbsp;int f[2][6];<br>&nbsp;&nbsp; &nbsp;int l[2][5];<br>&nbsp;&nbsp; &nbsp;int totalMin;<br>&nbsp;&nbsp; &nbsp;int lastL;<br>&nbsp;&nbsp; &nbsp;int i,k;<br>&nbsp;&nbsp; &nbsp;f[0][0]=e[0]+a[0][0];<br>&nbsp;&nbsp; &nbsp;f[1][0]=e[1]+a[1][0];<br><br>&nbsp;&nbsp; &nbsp;for(i=1;i&lt;6;i++)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if(f[0][i-1]&lt;(f[1][i-1]+t[1][i-1]))<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;f[0][i]=f[0][i-1]+a[0][i];<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;l[0][i-1]=1;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}else{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;f[0][i]=f[1][i-1]+t[1][i-1]+a[0][i];<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;l[0][i-1]=2;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if(f[1][i-1]&lt;(f[0][i-1]+t[0][i-1]))<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;f[1][i]=f[1][i-1]+a[1][i];<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;l[1][i-1]=2;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}else{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;f[1][i]=f[0][i-1]+t[0][i-1]+a[1][i];<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;l[1][i-1]=1;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;for(i=0;i&lt;2;i++)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for(k=0;k&lt;6;k++)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("%d&nbsp; ",f[i][k]);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("\n");<br>&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;if((x[0]+f[0][5])&lt;(x[1]+f[1][5]))<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;totalMin=x[0]+f[0][5];<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;lastL=1;<br>&nbsp;&nbsp; &nbsp;}else{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;totalMin=x[1]+f[1][5];<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;lastL=2;<br>&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;printf("totalMin=%d\n",totalMin);<br><br><br>&nbsp;&nbsp; &nbsp;if(lastL==1)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("S (1,6) ");<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;k=0;<br>&nbsp;&nbsp; &nbsp;}else{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("S (2,6) ");<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;k=1;<br>&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;for(i=4;i&gt;=0;i--)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if(l[k][i]==1)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("S (1, %d)&nbsp; ",i+1);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;k=0;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}else{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("S (2, %d)&nbsp; ",i+1);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;k=1;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;printf("\n");<br>}<br><br>int main()<br>{<br>&nbsp;&nbsp; &nbsp;int a[2][6]={{7,9,3,4,8,4},{8,5,6,4,5,7}};<br>&nbsp;&nbsp; &nbsp;int t[2][5]={{2,3,1,3,4},{2,1,2,2,1}};<br>&nbsp;&nbsp; &nbsp;int e[2]={2,4};<br>&nbsp;&nbsp; &nbsp;int x[2]={3,2};<br><br>&nbsp;&nbsp; &nbsp;schedule(a,t,e,x);<br><br>}
<br><br><img src ="http://www.cppblog.com/tankzhouqiang/aggbug/143364.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tankzhouqiang/" target="_blank">周强</a> 2011-04-03 21:26 <a href="http://www.cppblog.com/tankzhouqiang/archive/2011/04/03/143364.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>红黑树实现</title><link>http://www.cppblog.com/tankzhouqiang/archive/2011/04/02/143312.html</link><dc:creator>周强</dc:creator><author>周强</author><pubDate>Sat, 02 Apr 2011 13:43:00 GMT</pubDate><guid>http://www.cppblog.com/tankzhouqiang/archive/2011/04/02/143312.html</guid><wfw:comment>http://www.cppblog.com/tankzhouqiang/comments/143312.html</wfw:comment><comments>http://www.cppblog.com/tankzhouqiang/archive/2011/04/02/143312.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tankzhouqiang/comments/commentRss/143312.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tankzhouqiang/services/trackbacks/143312.html</trackback:ping><description><![CDATA[/*红黑树设计与实现<br>*参考算法导论<br>*http://www.cppblog.com/converse/archive/2008/11/10/66530.html<br><br>插入时有三种情况（这里只考虑z的父节点是z的祖父节点的左孩子，z的父节点是z的祖父节点的右孩子对称也一样）<br>（1） z的叔叔y是红色的（改变颜色,提升x）<br>（2） z的叔叔y是黑色的，而且z是右孩子（左旋）<br>（3） z的叔叔y是黑色的，而且z是左孩子（右旋加改变颜色）<br><br>删除时有四种情况（这里只考虑z是z的父节点的左孩子，z是z的父节点的右孩子对称也一样）<br>（1）x的兄弟w是红色的（左旋加改变颜色）<br>（2）x的兄弟w是黑色的，而且w的两个孩子都是黑色的（改变颜色，提升x)<br>（3）x的兄弟w是黑色的，w的左孩子是红色的，右孩子是黑色的(改变颜色加右旋)<br>（4）x的兄弟w是黑色的，而且w的右孩子是红色的（改变颜色加左旋）<br>*/<br><br>#include&lt;stdio.h&gt;<br>#include&lt;stdlib.h&gt;<br>#include&lt;string.h&gt;<br><br>/*定义颜色枚举类型*/<br>typedef enum color_t<br>{<br>&nbsp;&nbsp; &nbsp;RED=0,<br>&nbsp;&nbsp; &nbsp;BLACK=1<br>}color_t;<br><br><br>/*定义结构体*/<br>typedef struct rb_node_t<br>{<br>&nbsp;&nbsp; &nbsp;int key;<br>&nbsp;&nbsp; &nbsp;color_t color;<br>&nbsp;&nbsp; &nbsp;struct rb_node_t *left,*right,*parent;<br>}rb_node_t;<br><br>/* 测试是否为红黑树*/<br>int&nbsp; isRedBlackTree(rb_node_t *root,int count)<br>{<br>&nbsp;&nbsp; &nbsp;if(root==NULL)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("黑高度为 %d\n",count);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if(count!=12)/*通过测试该测试用例黑高度为12，不具有普遍性*/<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("not a redblack tree\n");<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;exit(1);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;}else{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if(root-&gt;color==BLACK)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;count++;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;else{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if((root-&gt;left!=NULL &amp;&amp;root-&gt;left-&gt;color==RED)||<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;(root-&gt;right!=NULL &amp;&amp; root-&gt;right-&gt;color==RED))<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("child color RED\n");<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;isRedBlackTree(root-&gt;left,count);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;isRedBlackTree(root-&gt;right,count);<br>&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;<br>}<br><br>/*中序打印节点用于测试*/<br>void midPrint(rb_node_t *root)<br>{<br>&nbsp;&nbsp;&nbsp; if(root!=NULL)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; midPrint(root-&gt;left);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("%d&nbsp; ",root-&gt;key);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(root-&gt;color==RED)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("RED&nbsp; ");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("BLACK&nbsp; ");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; midPrint(root-&gt;right);<br>&nbsp;&nbsp;&nbsp; }<br>}<br>/*先序打印节点用于测试*/<br>void prePrint(rb_node_t *root)<br>{<br>&nbsp;&nbsp;&nbsp; if(root!=NULL)<br>&nbsp;&nbsp;&nbsp; {<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("%d&nbsp; ",root-&gt;key);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(root-&gt;color==RED)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("RED&nbsp; ");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("BLACK&nbsp; ");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; prePrint(root-&gt;left);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; prePrint(root-&gt;right);<br>&nbsp;&nbsp;&nbsp; }<br>}<br><br>/*创建节点*/<br>rb_node_t * createNode(int key)<br>{<br>&nbsp;&nbsp;&nbsp; rb_node_t *newNode;<br>&nbsp;&nbsp;&nbsp; if((newNode=malloc(sizeof(rb_node_t)))==NULL)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("malloc error");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return NULL;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; newNode-&gt;color=RED;<br>&nbsp;&nbsp;&nbsp; newNode-&gt;left=NULL;<br>&nbsp;&nbsp;&nbsp; newNode-&gt;right=NULL;<br>&nbsp;&nbsp;&nbsp; newNode-&gt;key=key;<br>&nbsp;&nbsp;&nbsp; newNode-&gt;parent=NULL;<br>&nbsp;&nbsp;&nbsp; return newNode;<br>}<br><br>/*左旋*/<br>rb_node_t * leftRotate(rb_node_t *root,rb_node_t *node)<br>{<br>&nbsp;&nbsp;&nbsp; rb_node_t *right;<br>&nbsp;&nbsp;&nbsp; right=node-&gt;right;<br><br>&nbsp;&nbsp;&nbsp; if(node-&gt;right=right-&gt;left)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; right-&gt;left-&gt;parent=node;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; right-&gt;left=node;<br>&nbsp;&nbsp;&nbsp; if(right-&gt;parent=node-&gt;parent)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(node-&gt;parent-&gt;left==node)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; node-&gt;parent-&gt;left=right;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; node-&gt;parent-&gt;right=right;<br>&nbsp;&nbsp;&nbsp; }else<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; root=right;<br>&nbsp;&nbsp;&nbsp; node-&gt;parent=right;<br>&nbsp;&nbsp;&nbsp; return root;<br><br>}<br><br>/*右旋*/<br>rb_node_t *rightRotate(rb_node_t *root,rb_node_t *node)<br>{<br>&nbsp;&nbsp;&nbsp; rb_node_t *left;<br>&nbsp;&nbsp;&nbsp; left=node-&gt;left;<br>&nbsp;&nbsp;&nbsp; if(node-&gt;left=left-&gt;right)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; left-&gt;right-&gt;parent=node;<br>&nbsp;&nbsp;&nbsp; left-&gt;right=node;<br>&nbsp;&nbsp;&nbsp; if(left-&gt;parent=node-&gt;parent)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(node-&gt;parent-&gt;left==node)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; node-&gt;parent-&gt;left=left;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; node-&gt;parent-&gt;right=left;<br>&nbsp;&nbsp;&nbsp; }else<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; root=left;<br>&nbsp;&nbsp;&nbsp; node-&gt;parent=left;<br>&nbsp;&nbsp;&nbsp; return root;<br>}<br><br>/*查找节点，若找到则返回该节点，若没找到返回NULL并且将父节点保存到save中*/<br>rb_node_t * rb_search_auxiliary(int key,rb_node_t *root,rb_node_t **save)<br>{<br>&nbsp;&nbsp;&nbsp; rb_node_t *node,*parent;<br>&nbsp;&nbsp;&nbsp; node=root;<br>&nbsp;&nbsp;&nbsp; parent=NULL;<br>&nbsp;&nbsp;&nbsp; while(node)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; parent=node;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(node-&gt;key&lt;key)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; node=node-&gt;right;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else if(node-&gt;key&gt;key)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; node=node-&gt;left;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return node;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; if(save)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *save=parent;<br>&nbsp;&nbsp;&nbsp; return NULL;<br>}<br><br>/*查找节点*/<br>rb_node_t * rb_search(int key,rb_node_t *root)<br>{<br>&nbsp;&nbsp;&nbsp; return rb_search_auxiliary(key,root,NULL);<br>}<br><br>/*插入节点后进行调整，使其满足红黑树性质*/<br>rb_node_t * rb_insert_reblance(rb_node_t *root,rb_node_t *node)<br>{<br>&nbsp;&nbsp;&nbsp; rb_node_t *parent,*uncle,*grandParent,*temp;<br>&nbsp;&nbsp;&nbsp; while((parent=node-&gt;parent)&amp;&amp;(parent-&gt;color==RED))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; grandParent=parent-&gt;parent;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(parent==grandParent-&gt;left)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; uncle=grandParent-&gt;right;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(uncle!=NULL &amp;&amp; uncle-&gt;color==RED)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; parent-&gt;color=BLACK;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; uncle-&gt;color=BLACK;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; grandParent-&gt;color=RED;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; node=grandParent;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }else{<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(node==parent-&gt;right)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; root=leftRotate(root,parent);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; temp=parent;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; parent=node;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; node=temp;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //printf("##########\n");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //print(root);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //printf("\n");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; parent-&gt;color=BLACK;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; grandParent-&gt;color=RED;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; root=rightRotate(root,grandParent);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //printf("##########\n");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp; print(root);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp; printf("\n");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }else{<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; uncle=grandParent-&gt;left;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(uncle!=NULL &amp;&amp; uncle-&gt;color==RED)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; parent-&gt;color=BLACK;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; uncle-&gt;color=BLACK;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; grandParent-&gt;color=RED;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; node=grandParent;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }else{<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(node==parent-&gt;left)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; root=rightRotate(root,parent);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; temp=parent;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; parent=node;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; node=temp;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; parent-&gt;color=BLACK;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; grandParent-&gt;color=RED;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; root=leftRotate(root,grandParent);<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; root-&gt;color=BLACK;<br>&nbsp;&nbsp;&nbsp; return root;<br>}<br><br>/*红黑树插入节点*/<br>rb_node_t * rb_insert(rb_node_t *root,int key)<br>{<br>&nbsp;&nbsp;&nbsp; rb_node_t *parent,*newNode;<br>&nbsp;&nbsp;&nbsp; newNode=createNode(key);<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; if(rb_search_auxiliary(key,root,&amp;parent)!=NULL)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("already exixt\n");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return root;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; if(parent==NULL)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; root=newNode;<br>&nbsp;&nbsp;&nbsp; }else{<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; newNode-&gt;parent=parent;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(parent-&gt;key&lt;key)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; parent-&gt;right=newNode;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; parent-&gt;left=newNode;<br>&nbsp;&nbsp;&nbsp; }<br>//&nbsp;&nbsp;&nbsp; print(root);<br>//&nbsp;&nbsp;&nbsp; printf("\n");<br>&nbsp;&nbsp;&nbsp; root=rb_insert_reblance(root,newNode);<br>&nbsp;&nbsp;&nbsp; return root;<br>}<br><br><br>/*删除黑节点后进行调整，使其满足红黑树性质*/<br>rb_node_t *rb_delete_reblance(rb_node_t *root,rb_node_t *node,rb_node_t *parent)<br>{<br>&nbsp;&nbsp;&nbsp; rb_node_t *brother;<br>&nbsp;&nbsp;&nbsp; while((node==NULL ||node-&gt;color==BLACK)&amp;&amp;((node!=root)))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(node==parent-&gt;left)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; brother=parent-&gt;right;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(brother-&gt;color==RED)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; brother-&gt;color=BLACK;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; parent-&gt;color=RED;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; root=leftRotate(root,parent);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; brother=parent-&gt;right;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if((!brother-&gt;left || brother-&gt;left-&gt;color==BLACK)&amp;&amp;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (!brother-&gt;right || brother-&gt;right-&gt;color==BLACK))<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; brother-&gt;color=RED;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; node=parent;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; parent=parent-&gt;parent;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }else{<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(!brother-&gt;right || brother-&gt;right-&gt;color==BLACK)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; brother-&gt;color=RED;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; brother-&gt;left-&gt;color=BLACK;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; root=rightRotate(root,brother);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; brother=parent-&gt;right;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; brother-&gt;color=parent-&gt;color;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; parent-&gt;color=BLACK;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; brother-&gt;right-&gt;color=BLACK;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; root=leftRotate(root,parent);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; node=root;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }else{<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; brother=parent-&gt;left;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(brother-&gt;color==RED)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; brother-&gt;color=BLACK;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; parent-&gt;color=RED;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; root=rightRotate(root,parent);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; brother=parent-&gt;left;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if((!brother-&gt;left ||brother-&gt;left-&gt;color==BLACK) &amp;&amp;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (!brother-&gt;right ||brother-&gt;right-&gt;color==BLACK))<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; brother-&gt;color=RED;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; node=parent;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; parent=parent-&gt;parent;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }else {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(!brother-&gt;left || brother-&gt;left-&gt;color==BLACK)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; brother-&gt;color=RED;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; brother-&gt;right-&gt;color=BLACK;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; root=leftRotate(root,brother);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; brother=parent-&gt;left;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; brother-&gt;color=parent-&gt;color;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; parent-&gt;color=BLACK;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; brother-&gt;left-&gt;color=BLACK;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; root=rightRotate(root,parent);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; node=root;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; node-&gt;color=BLACK;<br>&nbsp;&nbsp;&nbsp; return root;<br>}<br><br>rb_node_t *rb_delete(rb_node_t *root,int key)<br>{<br>&nbsp;&nbsp;&nbsp; rb_node_t *node,*old,*child,*parent;<br>&nbsp;&nbsp;&nbsp; color_t color;<br>&nbsp;&nbsp;&nbsp; child=NULL;<br><br>&nbsp;&nbsp;&nbsp; if((node=rb_search(key,root))==NULL)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("not find the node\n");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return root;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; old=node;<br><br>&nbsp;&nbsp;&nbsp; if(node-&gt;left!=NULL &amp;&amp; node-&gt;right!=NULL)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; node=node-&gt;right;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while(node-&gt;left!=NULL)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; node=node-&gt;left;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; child=node-&gt;right;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; parent=node-&gt;parent;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(child)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; child-&gt;parent=parent;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(parent-&gt;left==node)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; parent-&gt;left=child;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; parent-&gt;right=child;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(node-&gt;parent==old)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; parent=node;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; color=node-&gt;color;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; node-&gt;left=old-&gt;left;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; node-&gt;right=old-&gt;right;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; node-&gt;color=old-&gt;color;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; node-&gt;parent=old-&gt;parent;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(old-&gt;parent)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(old-&gt;parent-&gt;left==old)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; old-&gt;parent-&gt;left=node;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; old-&gt;parent-&gt;right=node;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }else<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; root=node;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; old-&gt;left-&gt;parent=node;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(old-&gt;right)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; old-&gt;right-&gt;parent=node;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; free(old);<br>&nbsp;&nbsp;&nbsp; }else{<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; parent=node-&gt;parent;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(node-&gt;left!=NULL)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; child=node-&gt;left;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; child=node-&gt;right;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(child)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; child-&gt;parent=parent;<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(parent)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(parent-&gt;left==node)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; parent-&gt;left=child;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; parent-&gt;right=child;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }else<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; root=child;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; color=node-&gt;color;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; free(node);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; if(color==BLACK)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; rb_delete_reblance(root,child,parent);<br>&nbsp;&nbsp;&nbsp; return root;<br>}<br><br>int main()<br>{<br>&nbsp;&nbsp;&nbsp; int i,count=900000;<br>&nbsp;&nbsp;&nbsp; int key;<br>&nbsp;&nbsp;&nbsp; rb_node_t *root=NULL,*node=NULL;<br><br>&nbsp;&nbsp;&nbsp; srand(time(NULL));<br>&nbsp;&nbsp;&nbsp; int num=0;<br>&nbsp;&nbsp;&nbsp; for(i=1;i&lt;count;++i)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; key=rand()%count;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(root=rb_insert(root,key))<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("[i=%d] insert key %d,success!\n",i,key);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }else{<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("[i=%d] insert key %d error!\n",i,key);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; exit(1);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>//&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("当前树中节点\n");<br>//&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; midPrint(root);<br>//&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("\n");<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if((node=rb_search(key,root)))<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("[i=%d] search key %d success!\n",i,key);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }else{<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("[i=%d] search key %d error!\n",i,key);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; exit(1);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(!(i%10))<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp; prePrint(root);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if((root=rb_delete(root,key)))<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("[i=%d] delete key %d success\n",i,key);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }else<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("[i=%d] erase key %d error\n",i,key);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; exit(1);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; /*printf("#########线序遍历\n");<br>&nbsp;&nbsp;&nbsp; prePrint(root);<br>&nbsp;&nbsp;&nbsp; printf("\n");<br><br>&nbsp;&nbsp;&nbsp; printf("$$$$$$$$$中序遍历\n");<br>&nbsp;&nbsp;&nbsp; midPrint(root);<br>&nbsp;&nbsp;&nbsp; printf("\n");<br>&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; printf("the root color %d\n",root-&gt;color);<br>&nbsp;&nbsp;&nbsp; isRedBlackTree(root,0);<br><br>&nbsp;&nbsp;&nbsp; return 0;<br>} <br><br> <img src ="http://www.cppblog.com/tankzhouqiang/aggbug/143312.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tankzhouqiang/" target="_blank">周强</a> 2011-04-02 21:43 <a href="http://www.cppblog.com/tankzhouqiang/archive/2011/04/02/143312.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>二叉查找树实现</title><link>http://www.cppblog.com/tankzhouqiang/archive/2011/03/28/142862.html</link><dc:creator>周强</dc:creator><author>周强</author><pubDate>Mon, 28 Mar 2011 08:15:00 GMT</pubDate><guid>http://www.cppblog.com/tankzhouqiang/archive/2011/03/28/142862.html</guid><wfw:comment>http://www.cppblog.com/tankzhouqiang/comments/142862.html</wfw:comment><comments>http://www.cppblog.com/tankzhouqiang/archive/2011/03/28/142862.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tankzhouqiang/comments/commentRss/142862.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tankzhouqiang/services/trackbacks/142862.html</trackback:ping><description><![CDATA[#include&lt;stdio.h&gt;<br>#include&lt;stdlib.h&gt;<br>#include&lt;string.h&gt;<br><br>/*结构体节点*/<br>typedef struct&nbsp; _node{<br>&nbsp;&nbsp; &nbsp;int key;<br>&nbsp;&nbsp; &nbsp;struct _node *left;<br>&nbsp;&nbsp; &nbsp;struct _node *right;<br>&nbsp;&nbsp; &nbsp;struct _node *parent;<br>}node;<br><br><br>/*插入节点*/<br>void insert(node *root,node *toInsert)<br>{<br>&nbsp;&nbsp; &nbsp;node *p,*q;<br>&nbsp;&nbsp; &nbsp;p=root;<br>&nbsp;&nbsp; &nbsp;q=NULL;<br>&nbsp;&nbsp; &nbsp;if(toInsert==NULL || root==NULL)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return;<br>&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;while(p!=NULL)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;q=p;/*记录父节点*/<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if(toInsert-&gt;key&lt;p-&gt;key)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;p=p-&gt;left;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}else{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;p=p-&gt;right;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;if(toInsert-&gt;key&lt;q-&gt;key)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;q-&gt;left=toInsert;<br>&nbsp;&nbsp; &nbsp;}else{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;q-&gt;right=toInsert;<br>&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;toInsert-&gt;parent=q;<br>&nbsp;&nbsp; &nbsp;toInsert-&gt;left=NULL;<br>&nbsp;&nbsp; &nbsp;toInsert-&gt;right=NULL;<br>}<br><br>/*递归中序遍历根节点*/<br>void middleSearch(node *root)<br>{<br>&nbsp;&nbsp; &nbsp;if(root!=NULL)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;middleSearch(root-&gt;left);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("%d\t",root-&gt;key);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;middleSearch(root-&gt;right);<br>&nbsp;&nbsp; &nbsp;}<br>}<br>/*先序遍历*/<br>void preSearch(node *root)<br>{<br>&nbsp;&nbsp; &nbsp;if(root!=NULL)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("%d\t",root-&gt;key);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;preSearch(root-&gt;left);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;preSearch(root-&gt;right);<br>&nbsp;&nbsp; &nbsp;}<br>}<br><br>/*查找返回节点关键字为key的节点*/<br>node* search(node *root,int key)<br>{<br>&nbsp;&nbsp; &nbsp;node *p=root;<br>&nbsp;&nbsp; &nbsp;while(p!=NULL)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if(key&lt;p-&gt;key)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;p=p-&gt;left;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}else if(key&gt;p-&gt;key)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;p=p-&gt;right;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}else<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;break;<br>&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;return p;<br>}<br><br>/*查找二叉树最小值*/<br>node *minimun(node *root)<br>{<br>&nbsp;&nbsp; &nbsp;node *p=root;<br>&nbsp;&nbsp; &nbsp;if(p==NULL)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return p;<br>&nbsp;&nbsp; &nbsp;while(p-&gt;left!=NULL)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;p=p-&gt;left;<br>&nbsp;&nbsp; &nbsp;printf("min %d\n",p-&gt;key);<br>&nbsp;&nbsp; &nbsp;return p;<br>}<br><br>/*查找二叉树最大值*/<br>node *maximun(node *root)<br>{<br>&nbsp;&nbsp; &nbsp;node *p=root;<br>&nbsp;&nbsp; &nbsp;if(p==NULL)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return;<br>&nbsp;&nbsp; &nbsp;while(p-&gt;right!=NULL)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;p=p-&gt;right;<br>&nbsp;&nbsp; &nbsp;printf("max %d\n",p-&gt;key);<br>&nbsp;&nbsp; &nbsp;return p;<br>}<br>/*找节点后续*/<br>node* successor(node *x)<br>{<br>&nbsp;&nbsp; &nbsp;node *p;<br>&nbsp;&nbsp; &nbsp;if(NULL==x)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return x;<br>&nbsp;&nbsp; &nbsp;if(x-&gt;right!=NULL)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return minimun(x-&gt;right);<br>&nbsp;&nbsp; &nbsp;p=x-&gt;parent;<br>&nbsp;&nbsp; &nbsp;while(p!=NULL &amp;&amp; p-&gt;right==x)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;x=p;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;p=p-&gt;parent;<br>&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;return p;<br>}<br><br>/*删除节点*/<br>void delete(node *root,node *toDelete)<br>{<br>&nbsp;&nbsp; &nbsp;node *p,*q;<br>&nbsp;&nbsp; &nbsp;int key;<br>&nbsp;&nbsp; &nbsp;if(root==NULL || toDelete==NULL)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return ;<br>&nbsp;&nbsp; &nbsp;p=toDelete-&gt;parent;<br><br>&nbsp;&nbsp; &nbsp;/*第一种情况，要删除的节点的左右子树都为空*/<br>&nbsp;&nbsp; &nbsp;if(toDelete-&gt;left ==NULL &amp;&amp; toDelete-&gt;right ==NULL)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if(p==NULL)/*要删除的是根节点*/<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;free(toDelete);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if(p-&gt;left==toDelete)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;p-&gt;left=NULL;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}else <br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;p-&gt;right=NULL;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;free(toDelete);<br><br>&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;/*第二种情况，要删除的左子树为空，右子树不为空*/<br>&nbsp;&nbsp; &nbsp;else if(toDelete-&gt;left==NULL)<br>&nbsp;&nbsp; &nbsp;{&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if(p==NULL)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;q=root-&gt;right;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;root-&gt;key=q-&gt;key;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;root-&gt;left=q-&gt;left;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;root-&gt;right=q-&gt;right;<br><br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;free(q);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;else if(p-&gt;left==toDelete)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;p-&gt;left=toDelete-&gt;right;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}else<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;p-&gt;right=toDelete-&gt;right;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;toDelete-&gt;right-&gt;parent=p;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;free(toDelete);<br>&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;/* 第三种情况，要删除的右子树为空，左子树不为空*/<br>&nbsp;&nbsp; &nbsp;else if(toDelete-&gt;right==NULL)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if(p==NULL)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;q=root-&gt;left;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;root-&gt;key=q-&gt;key;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;root-&gt;left=q-&gt;left;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;root-&gt;right=q-&gt;right;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;root-&gt;parent=NULL;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;free(q);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;else if(p-&gt;left==toDelete)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;p-&gt;left=toDelete-&gt;left;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}else<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;p-&gt;right=toDelete-&gt;right;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;toDelete-&gt;parent=p;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;free(toDelete);<br>&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;/* 第四种情况，要删除的左右子树都不为空*/<br>&nbsp;&nbsp; &nbsp;else{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;q=successor(toDelete);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;key=q-&gt;key;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;delete(root,q);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;toDelete-&gt;key=key;<br>&nbsp;&nbsp; &nbsp;}<br>}<br><br>int main()<br>{<br>&nbsp;&nbsp; &nbsp;node *root;<br><br>&nbsp;&nbsp; &nbsp;int a[12]={15,5,3,12,10,13,6,7,16,20,18,23};<br>&nbsp;&nbsp; &nbsp;node *toInsert;<br>&nbsp;&nbsp; &nbsp;node *x,*y;<br>&nbsp;&nbsp; &nbsp;int i;<br>&nbsp;&nbsp; &nbsp;/*创建头节点*/<br>&nbsp;&nbsp; &nbsp;if((root=(node*)malloc(sizeof(node)))==NULL)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;perror("malloc error");<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;exit(1);<br>&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;root-&gt;key=a[0];<br>&nbsp;&nbsp; &nbsp;/*插入节点*/<br>&nbsp;&nbsp; &nbsp;for(i=1;i&lt;12;i++)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if((toInsert=(node*)malloc(sizeof(node)))==NULL)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;perror("malloc error");<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;exit(1);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;toInsert-&gt;key=a[i];<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;insert(root,toInsert);<br>&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;/*中序遍历*/<br>&nbsp;&nbsp; &nbsp;middleSearch(root);<br>&nbsp;&nbsp; &nbsp;printf("\n");<br>&nbsp;&nbsp; &nbsp;/*先序遍历*/<br>&nbsp;&nbsp; &nbsp;preSearch(root);<br>&nbsp;&nbsp; &nbsp;printf("\n");<br><br>&nbsp;&nbsp; &nbsp;/*最大值*/<br>&nbsp;&nbsp; &nbsp;maximun(root);<br>&nbsp;&nbsp; &nbsp;/*最小值*/<br>&nbsp;&nbsp; &nbsp;minimun(root);<br><br>&nbsp;&nbsp; &nbsp;/*查找关键字节点及其前驱*/<br>&nbsp;&nbsp; &nbsp;x=search(root,6);<br>&nbsp;&nbsp; &nbsp;y=successor(x);<br>&nbsp;&nbsp; &nbsp;if(y!=NULL)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("节点 6 后驱 %d\n",y-&gt;key);<br><br>&nbsp;&nbsp; &nbsp;x=search(root,3);<br>&nbsp;&nbsp; &nbsp;y=successor(x);<br>&nbsp;&nbsp; &nbsp;if(y!=NULL)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("节点 3 后驱 %d\n",y-&gt;key);<br><br><br>&nbsp;&nbsp; &nbsp;x=search(root,13);<br>&nbsp;&nbsp; &nbsp;y=successor(x);<br>&nbsp;&nbsp; &nbsp;if(y!=NULL)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("节点 13 后驱 %d\n",y-&gt;key);<br><br><br>&nbsp;&nbsp; &nbsp;x=search(root,23);<br>&nbsp;&nbsp; &nbsp;y=successor(x);<br>&nbsp;&nbsp; &nbsp;if(y!=NULL)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("节点 23 后驱 %d\n",y-&gt;key);<br><br>&nbsp;&nbsp; &nbsp;/*删除节点*/<br>&nbsp;&nbsp; &nbsp;printf("before delete the node\n");<br>&nbsp;&nbsp; &nbsp;x=search(root,13);<br><br>&nbsp;&nbsp; &nbsp;delete(root,x);<br>&nbsp;&nbsp; &nbsp;printf("\nafter delete the node\n");<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp;&nbsp; printf("中序遍历\n");<br>&nbsp;&nbsp;&nbsp; middleSearch(root);<br>&nbsp;&nbsp;&nbsp; printf("\n先序遍历\n");<br>&nbsp;&nbsp;&nbsp; preSearch(root);<br><br>&nbsp;&nbsp;&nbsp; if((toInsert=(node*)malloc(sizeof(node)))==NULL)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; perror("malloc error");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; exit(1);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; toInsert-&gt;key=13;<br>&nbsp;&nbsp;&nbsp; insert(root,toInsert);<br>&nbsp;&nbsp;&nbsp; printf("\n中序遍历\n");<br>&nbsp;&nbsp;&nbsp; middleSearch(root);<br>&nbsp;&nbsp;&nbsp; printf("\n先序遍历\n");<br>&nbsp;&nbsp;&nbsp; preSearch(root);<br><br><br>&nbsp;&nbsp;&nbsp; printf("\nbefore delete the node\n");<br>&nbsp;&nbsp;&nbsp; x=search(root,16);<br>&nbsp;&nbsp;&nbsp; delete(root,x);<br>&nbsp;&nbsp;&nbsp; printf("\nafter delete the node\n");<br>&nbsp;&nbsp;&nbsp; printf("中序遍历\n");<br>&nbsp;&nbsp;&nbsp; middleSearch(root);<br>&nbsp;&nbsp;&nbsp; printf("\n先序遍历\n");<br>&nbsp;&nbsp;&nbsp; preSearch(root);<br><br>&nbsp;&nbsp;&nbsp; if((toInsert=(node*)malloc(sizeof(node)))==NULL)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; perror("malloc error");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; exit(1);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; toInsert-&gt;key=16;<br>&nbsp;&nbsp;&nbsp; insert(root,toInsert);<br>&nbsp;&nbsp;&nbsp; printf("\n中序遍历\n");<br>&nbsp;&nbsp;&nbsp; middleSearch(root);<br>&nbsp;&nbsp;&nbsp; printf("\n先序遍历\n");<br>&nbsp;&nbsp;&nbsp; preSearch(root);<br><br>&nbsp;&nbsp;&nbsp; printf("\nbefore delete the node\n");<br>&nbsp;&nbsp;&nbsp; x=search(root,5);<br>&nbsp;&nbsp;&nbsp; delete(root,x);<br>&nbsp;&nbsp;&nbsp; printf("\nafter delete the node\n");<br>&nbsp;&nbsp;&nbsp; printf("中序遍历\n");<br>&nbsp;&nbsp;&nbsp; middleSearch(root);<br>&nbsp;&nbsp;&nbsp; printf("\n先序遍历\n");<br>&nbsp;&nbsp;&nbsp; preSearch(root);<br>&nbsp;&nbsp;&nbsp; if((toInsert=(node*)malloc(sizeof(node)))==NULL)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; perror("malloc error");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; exit(1);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; toInsert-&gt;key=5;<br>&nbsp;&nbsp;&nbsp; insert(root,toInsert);<br><br>&nbsp;&nbsp;&nbsp; printf("\n中序遍历\n");<br>&nbsp;&nbsp;&nbsp; middleSearch(root);<br>&nbsp;&nbsp;&nbsp; printf("\n先序遍历\n");<br>&nbsp;&nbsp;&nbsp; preSearch(root);<br><br>&nbsp;&nbsp;&nbsp; printf("\nbefore delete the node\n");<br>&nbsp;&nbsp;&nbsp; x=search(root,15);<br><br>&nbsp;&nbsp;&nbsp; delete(root,x);<br>&nbsp;&nbsp;&nbsp; printf("\nafter delete the node\n");<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; printf("中序遍历\n");<br>&nbsp;&nbsp;&nbsp; middleSearch(root);<br>&nbsp;&nbsp;&nbsp; printf("\n先序遍历\n");<br>&nbsp;&nbsp;&nbsp; preSearch(root);<br><br>&nbsp;&nbsp;&nbsp; printf("\n");<br><br><br>&nbsp;&nbsp;&nbsp; printf("before delete the node\n");<br>&nbsp;&nbsp;&nbsp; x=search(root,16);<br><br>&nbsp;&nbsp;&nbsp; delete(root,x);<br>&nbsp;&nbsp;&nbsp; printf("\nafter delete the node\n");<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; printf("中序遍历\n");<br>&nbsp;&nbsp;&nbsp; middleSearch(root);<br>&nbsp;&nbsp;&nbsp; printf("\n先序遍历\n");<br>&nbsp;&nbsp;&nbsp; preSearch(root);<br>&nbsp;&nbsp;&nbsp; printf("\n");<br><br><br><br>&nbsp;&nbsp;&nbsp; printf("before delete the node\n");<br>&nbsp;&nbsp;&nbsp; x=search(root,18);<br><br>&nbsp;&nbsp;&nbsp; delete(root,x);<br>&nbsp;&nbsp;&nbsp; printf("\nafter delete the node\n");<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; printf("中序遍历\n");<br>&nbsp;&nbsp;&nbsp; middleSearch(root);<br>&nbsp;&nbsp;&nbsp; printf("\n先序遍历\n");<br>&nbsp;&nbsp;&nbsp; preSearch(root);<br>&nbsp;&nbsp;&nbsp; printf("\n");<br><br>&nbsp;&nbsp;&nbsp; printf("before delete the node\n");<br>&nbsp;&nbsp;&nbsp; x=search(root,20);<br><br>&nbsp;&nbsp;&nbsp; delete(root,x);<br>&nbsp;&nbsp;&nbsp; printf("\nafter delete the node\n");<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; printf("中序遍历\n");<br>&nbsp;&nbsp;&nbsp; middleSearch(root);<br>&nbsp;&nbsp;&nbsp; printf("\n先序遍历\n");<br>&nbsp;&nbsp;&nbsp; preSearch(root);<br>&nbsp;&nbsp;&nbsp; printf("\n");<br><br><br>&nbsp;&nbsp;&nbsp; printf("before delete the node\n");<br>&nbsp;&nbsp;&nbsp; x=search(root,23);<br><br>&nbsp;&nbsp;&nbsp; delete(root,x);<br>&nbsp;&nbsp;&nbsp; printf("\nafter delete the node\n");<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; printf("中序遍历\n");<br>&nbsp;&nbsp;&nbsp; middleSearch(root);<br>&nbsp;&nbsp;&nbsp; printf("\n先序遍历\n");<br>&nbsp;&nbsp;&nbsp; preSearch(root);<br>&nbsp;&nbsp;&nbsp; printf("\n");<br>}<br>&nbsp;<br><img src ="http://www.cppblog.com/tankzhouqiang/aggbug/142862.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tankzhouqiang/" target="_blank">周强</a> 2011-03-28 16:15 <a href="http://www.cppblog.com/tankzhouqiang/archive/2011/03/28/142862.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>快速排序实现</title><link>http://www.cppblog.com/tankzhouqiang/archive/2011/03/22/142455.html</link><dc:creator>周强</dc:creator><author>周强</author><pubDate>Tue, 22 Mar 2011 02:28:00 GMT</pubDate><guid>http://www.cppblog.com/tankzhouqiang/archive/2011/03/22/142455.html</guid><wfw:comment>http://www.cppblog.com/tankzhouqiang/comments/142455.html</wfw:comment><comments>http://www.cppblog.com/tankzhouqiang/archive/2011/03/22/142455.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tankzhouqiang/comments/commentRss/142455.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tankzhouqiang/services/trackbacks/142455.html</trackback:ping><description><![CDATA[/*快速排序算法实现，快序排序算法最坏复杂度为O(n^2),平均复杂度为O(nlgn),而且该比例因子比较少*/<br><br>#include&lt;stdio.h&gt;<br>#include&lt;stdlib.h&gt;<br><br><br>void print(int A[],int len)<br>{<br>&nbsp;&nbsp; &nbsp;int i;<br>&nbsp;&nbsp; &nbsp;for(i=0;i&lt;len;i++)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("%d&nbsp; ",A[i]);<br>&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;printf("\n");<br>}<br><br>int quickPart(int A[],int begin,int end)<br>{<br>&nbsp;&nbsp; &nbsp;int key,i,j,temp;<br>&nbsp;&nbsp; &nbsp;key=A[end-1];<br>&nbsp;&nbsp; &nbsp;i=begin-1;<br>&nbsp;&nbsp; &nbsp;for(j=begin;j&lt;end-1;j++)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if(A[j]&lt;key)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;i++;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;temp=A[i];<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;A[i]=A[j];<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;A[j]=temp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;i++;<br>&nbsp;&nbsp; &nbsp;temp=A[i];<br>&nbsp;&nbsp; &nbsp;A[i]=key;<br>&nbsp;&nbsp; &nbsp;A[end-1]=temp;<br>&nbsp;&nbsp; &nbsp;return (i);<br>}<br><br><br>void quickSort(int A[],int begin,int end)<br>{<br>&nbsp;&nbsp; &nbsp;int q;<br>&nbsp;&nbsp; &nbsp;if(end&gt;begin)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;q=quickPart(A,begin,end);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;quickSort(A,begin,q);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;quickSort(A,q+1,end);<br>&nbsp;&nbsp; &nbsp;}<br>}<br><br><br>int main()<br>{<br>&nbsp;&nbsp; &nbsp;int&nbsp; A[8]={2,8,7,1,3,5,6,4};<br>&nbsp;&nbsp; &nbsp;quickSort(A,0,8);<br>&nbsp;&nbsp; &nbsp;printf("after sort\n");<br>&nbsp;&nbsp; &nbsp;print(A,8);<br>}<br><br>
<br>
<br><img src ="http://www.cppblog.com/tankzhouqiang/aggbug/142455.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tankzhouqiang/" target="_blank">周强</a> 2011-03-22 10:28 <a href="http://www.cppblog.com/tankzhouqiang/archive/2011/03/22/142455.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>堆排序c语言实现</title><link>http://www.cppblog.com/tankzhouqiang/archive/2011/03/21/142413.html</link><dc:creator>周强</dc:creator><author>周强</author><pubDate>Mon, 21 Mar 2011 13:48:00 GMT</pubDate><guid>http://www.cppblog.com/tankzhouqiang/archive/2011/03/21/142413.html</guid><wfw:comment>http://www.cppblog.com/tankzhouqiang/comments/142413.html</wfw:comment><comments>http://www.cppblog.com/tankzhouqiang/archive/2011/03/21/142413.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tankzhouqiang/comments/commentRss/142413.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tankzhouqiang/services/trackbacks/142413.html</trackback:ping><description><![CDATA[/*堆排序 实现，算法复杂度O(nlgn)*/<br>#include&lt;stdio.h&gt;<br>#include&lt;stdlib.h&gt;<br><br>/*假设节点i的左右子树都是最大堆，操作使节点i的子树变成最大堆*/<br>void maxHeap(int A[],int len,int i)<br>{<br>&nbsp;&nbsp;&nbsp; int l,r,large,temp;<br>&nbsp;&nbsp;&nbsp; l=2*i;<br>&nbsp;&nbsp;&nbsp; r=2*i+1;<br>&nbsp;&nbsp;&nbsp; large=i;<br>&nbsp;&nbsp;&nbsp; if(l&lt;len)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(A[l]&gt;A[i])<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; large=l;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; if(r&lt;len)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(A[r]&gt;A[large])<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; large=r;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; if(large!=i)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; temp=A[large];<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; A[large]=A[i];<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; A[i]=temp;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; maxHeap(A,len,large);<br>&nbsp;&nbsp;&nbsp; }<br>}<br><br>/*建立大根堆*/<br>void buildMaxHeap(int A[],int len)<br>{<br>&nbsp;&nbsp;&nbsp; int i;<br>&nbsp;&nbsp;&nbsp; for(i=len/2-1;i&gt;=0;i--)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; maxHeap(A,len,i);<br>}<br><br><br>/*堆排序*/<br>void maxHeapSort(int A[],int len)<br>{<br>&nbsp;&nbsp;&nbsp; int i,temp;<br>&nbsp;&nbsp;&nbsp; buildMaxHeap(A,len);<br>&nbsp;&nbsp;&nbsp; printf("建立大跟堆\n");<br>&nbsp;&nbsp;&nbsp; for(i=0;i&lt;len;i++)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("%d ",A[i]);<br>&nbsp;&nbsp;&nbsp; printf("\n");<br><br>&nbsp;&nbsp;&nbsp; for(i=len;i&gt;1;i--)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; temp=A[0];<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; A[0]=A[i-1];<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; A[i-1]=temp;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("%d&nbsp; ",A[i-1]);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; buildMaxHeap(A,i-1);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; printf("\n");<br>}<br><br>/*测试堆排序*/<br>int main()<br>{<br>&nbsp;&nbsp;&nbsp; int i;<br>&nbsp;&nbsp;&nbsp; int A[11]={4,1,3,2,16,9,10,14,8,7,6};<br>&nbsp;&nbsp;&nbsp; maxHeapSort(A,11);<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; for(i=0;i&lt;11;i++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("%d&nbsp; ",A[i]);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; printf("\n");<br>}<br>
<br><img src ="http://www.cppblog.com/tankzhouqiang/aggbug/142413.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tankzhouqiang/" target="_blank">周强</a> 2011-03-21 21:48 <a href="http://www.cppblog.com/tankzhouqiang/archive/2011/03/21/142413.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>插入排序，选择排序，冒泡排序，归并排序（c语言实现）</title><link>http://www.cppblog.com/tankzhouqiang/archive/2011/03/15/141892.html</link><dc:creator>周强</dc:creator><author>周强</author><pubDate>Tue, 15 Mar 2011 08:15:00 GMT</pubDate><guid>http://www.cppblog.com/tankzhouqiang/archive/2011/03/15/141892.html</guid><wfw:comment>http://www.cppblog.com/tankzhouqiang/comments/141892.html</wfw:comment><comments>http://www.cppblog.com/tankzhouqiang/archive/2011/03/15/141892.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tankzhouqiang/comments/commentRss/141892.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tankzhouqiang/services/trackbacks/141892.html</trackback:ping><description><![CDATA[今天复习了下一些常见的排序算法,并用c语言实现了下。代码如下：<br>#include&lt;stdio.h&gt;<br>#include&lt;stdlib.h&gt;<br><br>#define MAX 65536 /*用于归并排序中的哨兵*/<br><br>/*简单插入排序,时间复杂度为o(n2),稳定排序，适合已经排好序的*/<br>void insertSort(int arr[],int len)<br>{<br>&nbsp;&nbsp;&nbsp; int i,j;<br>&nbsp;&nbsp;&nbsp; int key;<br>&nbsp;&nbsp;&nbsp; for(i=1;i&lt;len;i++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; key=arr[i];<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(j=i-1;j&gt;=0;j--)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(arr[j]&gt;key)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; arr[j+1]=arr[j];<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; arr[j+1]=key;<br>&nbsp;&nbsp;&nbsp; }<br>}<br><br>/*选择排序，时间复杂度为o(n2),不稳定排序，适合规模比较小的*/<br>void selectSort(int arr[],int len)<br>{<br>&nbsp;&nbsp;&nbsp; int i,j,temp;<br>&nbsp;&nbsp;&nbsp; for(i=0;i&lt;len;i++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(j=i+1;j&lt;len;j++)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(arr[i]&gt;arr[j])<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; temp=arr[i];<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; arr[i]=arr[j];<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; arr[j]=temp;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>}<br><br>/*冒泡排序，时间复杂度为o(n2),稳定排序，适合规模比较小的*/<br>void bubbleSort(int arr[],int len)<br>{<br>&nbsp;&nbsp;&nbsp; int i,j,temp;<br>&nbsp;&nbsp;&nbsp; for(i=0;i&lt;len;i++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(j=0;j&lt;len-i-1;j++)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(arr[j]&gt;arr[j+1])<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; temp=arr[j];<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; arr[j]=arr[j+1];<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; arr[j+1]=temp;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>}<br><br>/*合并（归并）排序,时间复杂度为o(nlogn),稳定排序，适合规模比较大的排序*/<br>void merge(int arr[],int p,int q,int r)<br>{<br>&nbsp;&nbsp;&nbsp; int *A,*B;<br>&nbsp;&nbsp;&nbsp; int n1,n2,i,j,k;<br>&nbsp;&nbsp;&nbsp; n1=q-p+1;<br>&nbsp;&nbsp;&nbsp; n2=r-q;<br>&nbsp;&nbsp;&nbsp; if((A=(int*)malloc((n1+1)*sizeof(int)))==NULL)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; perror("malloc error");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; exit(1);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; if((B=(int*)malloc((n2+1)*sizeof(int)))==NULL)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; perror("malloc error");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; exit(1);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; for(i=0;i&lt;n1;i++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; A[i]=arr[p+i];<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; A[i]=MAX;<br>&nbsp;&nbsp;&nbsp; for(i=0;i&lt;n2;i++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; B[i]=arr[q+i+1];<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; B[i]=MAX;<br>&nbsp;&nbsp;&nbsp; i=0;j=0;<br>&nbsp;&nbsp;&nbsp; for(k=p;k&lt;=r;k++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(A[i]&gt;B[j])<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; arr[k]=B[j];<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; j++;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }else{<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; arr[k]=A[i];<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; i++;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>}<br><br>void mergeSort(int arr[],int begin,int end)<br>{<br>&nbsp;&nbsp;&nbsp; int mid;<br>&nbsp;&nbsp;&nbsp; if(begin&lt;end)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; mid=(begin+end)/2;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; mergeSort(arr,begin,mid);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; mergeSort(arr,mid+1,end);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; merge(arr,begin,mid,end);<br>&nbsp;&nbsp;&nbsp; }<br>}<br><br>int main()<br>{<br>&nbsp;&nbsp;&nbsp; int a[8]={5,2,4,7,1,3,2,6};<br>&nbsp;&nbsp;&nbsp; int b[8]={5,2,4,7,1,3,2,6};<br>&nbsp;&nbsp;&nbsp; int c[8]={5,2,4,7,1,3,2,6};<br>&nbsp;&nbsp;&nbsp; int d[8]={5,2,4,7,1,3,2,6};<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; int i;<br>&nbsp;&nbsp;&nbsp; /*测试插入排序*/<br>&nbsp;&nbsp;&nbsp; insertSort(a,8);<br>&nbsp;&nbsp;&nbsp; printf("after 插入排序\n");<br>&nbsp;&nbsp;&nbsp; for(i=0;i&lt;8;i++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("%d ",a[i]);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; printf("\n");<br><br>&nbsp;&nbsp;&nbsp; /*测试选择排序*/<br>&nbsp;&nbsp;&nbsp; selectSort(b,8);<br>&nbsp;&nbsp;&nbsp; printf("after 选择排序\n");<br>&nbsp;&nbsp;&nbsp; for(i=0;i&lt;8;i++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("%d ",b[i]);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; printf("\n");<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; /*测试冒泡排序*/<br>&nbsp;&nbsp;&nbsp; bubbleSort(c,8);<br>&nbsp;&nbsp;&nbsp; printf("after 冒泡排序\n");<br>&nbsp;&nbsp;&nbsp; for(i=0;i&lt;8;i++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("%d ",c[i]);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; printf("\n");<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; /*测试归并排序*/<br>&nbsp;&nbsp;&nbsp; mergeSort(d,0,7);<br><br>&nbsp;&nbsp;&nbsp; printf("after 归并排序\n");<br>&nbsp;&nbsp;&nbsp; for(i=0;i&lt;8;i++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("%d ",d[i]);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; printf("\n");<br>}<br><br><img src ="http://www.cppblog.com/tankzhouqiang/aggbug/141892.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tankzhouqiang/" target="_blank">周强</a> 2011-03-15 16:15 <a href="http://www.cppblog.com/tankzhouqiang/archive/2011/03/15/141892.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>KMP算法实现</title><link>http://www.cppblog.com/tankzhouqiang/archive/2011/03/02/140974.html</link><dc:creator>周强</dc:creator><author>周强</author><pubDate>Wed, 02 Mar 2011 04:23:00 GMT</pubDate><guid>http://www.cppblog.com/tankzhouqiang/archive/2011/03/02/140974.html</guid><wfw:comment>http://www.cppblog.com/tankzhouqiang/comments/140974.html</wfw:comment><comments>http://www.cppblog.com/tankzhouqiang/archive/2011/03/02/140974.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tankzhouqiang/comments/commentRss/140974.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tankzhouqiang/services/trackbacks/140974.html</trackback:ping><description><![CDATA[<h1 class="title_txt"><cite class="fav_csdnstylebykimi"> </cite>
</h1>
<div class="blogstory">
<p>#include&lt;stdio.h&gt;<br>#include&lt;stdlib.h&gt;<br>#include&lt;string.h&gt;<br><br>/*naive string-matching algorithm,T为原始字符串，P为需要匹配的字符串*/<br>void naiveMatch(char *T,char *P)<br>{<br>&nbsp;&nbsp;&nbsp; int lenT,lenP,i,j;<br>&nbsp;&nbsp;&nbsp; lenT=strlen(T);<br>&nbsp;&nbsp;&nbsp; lenP=strlen(P);<br>&nbsp;&nbsp;&nbsp; if(lenT&lt;lenP)/*需要匹配的字符串比原始字符串还要长出错*/<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; perror("input error");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return ;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; for(i=0;i&lt;(lenT-lenP+1);i++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(j=0;j&lt;lenP;j++)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(T[i+j]!=P[j])<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(j==lenP)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("string match at place %d\n",i);<br>&nbsp;&nbsp;&nbsp; }<br>}<br><br>/*kmp预处理需要的匹配串*/<br>void getNext(char *p,int next[])<br>{<br>&nbsp;&nbsp;&nbsp; int len,i,j;<br>&nbsp;&nbsp;&nbsp; len=strlen(p);<br>&nbsp;&nbsp;&nbsp; next[0]=0;<br>&nbsp;&nbsp;&nbsp; for(i=1;i&lt;len;i++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; j=next[i-1];<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while((p[i-1]!=p[j-1])&amp;&amp;(j!=0))<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; j=next[j-1];<br>//&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("j= %d\n",j);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; next[i]=j+1;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("next[i]=%d\n",next[i]);<br>&nbsp;&nbsp;&nbsp; }<br>}<br><br>/*kmp字符串匹配算法*/<br>void kmp(char *t,char *p,int next[])<br>{<br>&nbsp;&nbsp;&nbsp; int lent,lenp,i,j;<br>&nbsp;&nbsp;&nbsp; lent=strlen(t);<br>&nbsp;&nbsp;&nbsp; lenp=strlen(p);<br>&nbsp;&nbsp;&nbsp; i=0;<br>&nbsp;&nbsp;&nbsp; j=0;<br>&nbsp;&nbsp;&nbsp; while(i&lt;(lent))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if((j==-1)||(t[i]==p[j]))<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; i++;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; j++;<br><br>//&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("i=%d,j=%d\n",i,j);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>//&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("in else i=%d,j=%d\n",i,j);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; j=next[j]-1;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(j==(lenp))<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("match at place %d\n",i-lenp);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>}<br><br>int main()<br>{<br>&nbsp;&nbsp;&nbsp; char p[10]="0001";<br>&nbsp;&nbsp;&nbsp; char t[20]="000010001010001";<br>&nbsp;&nbsp;&nbsp; naiveMatch(t,p);/*测试普通字符串匹配算法*/<br>&nbsp;&nbsp;&nbsp; char p1[10]="abaabcac";<br>&nbsp;&nbsp;&nbsp; char t1[20]="acabaabaabcacaabc";<br>&nbsp;&nbsp;&nbsp; int len=strlen(p1);<br>&nbsp;&nbsp;&nbsp; int *next;<br>&nbsp;&nbsp;&nbsp; next=(int*)malloc(sizeof(int)*len);<br>&nbsp;&nbsp;&nbsp; getNext(p1,next);<br>&nbsp;&nbsp;&nbsp; kmp(t1,p1,next);/*测试kmp算法*/</p>
<p><br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; getNext(p,next);<br>&nbsp;&nbsp;&nbsp; kmp(t,p,next);/*测试kmp算法*/<br>}</p>
<p class="right articalinfo">
</p>
</div><img src ="http://www.cppblog.com/tankzhouqiang/aggbug/140974.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tankzhouqiang/" target="_blank">周强</a> 2011-03-02 12:23 <a href="http://www.cppblog.com/tankzhouqiang/archive/2011/03/02/140974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>